3 ответов:
так же, как и с любым другим методом в Ruby (или на самом деле почти любой объектно-ориентированный язык),
a === bозначает, что автор 's хочет, чтобы это означало.
однако, если вы не хотите, чтобы запутать черт из ваших коллег, конвенция заключается в том, что
===- это случае поглощения оператора. В принципе, это булев оператор, который задает вопрос"если у меня есть ящик с надписьюaбудет смысл ставитьbв этом ящике?"альтернативная формулировка:"если
aописал, чтоbбыть членом этого набора?"например:
(1..5) === 3 # => true (1..5) === 6 # => false Integer === 42 # => true Integer === 'fourtytwo' # => false /ell/ === 'Hello' # => true /ell/ === 'Foobar' # => falseосновное использование для
===операторcaseвыражения, начиная сcase foo when bar baz when quux flurb else blarf endпереводится на что-то (грубо), как
_temp = foo if bar === _temp baz elsif quux === _temp flurb else blarf endобратите внимание, что если вы хотите найти этот оператор, он обычно называется элемент triple equals operator или оператор threequals или случае оператор равенства. Мне очень не нравятся эти имена, потому что этот оператор не имеет абсолютно никакого отношения к равенству.
в частности, можно было бы ожидать, что равенство будет симметричным: если
наaравнаb, потомbлучше быть равенa. Кроме того, можно было бы ожидать, что равенство будет транзитивным: еслиa == bиb == c, потомa == c. В то время как нет никакого способа на самом деле гарантия что в языке с одной отправкой, таком как Ruby, вы должны хотя бы попытаться сохранить это свойство (например, следуяcoerceпротокола).===нет никакого ожидания ни симметрии, ни транзитивности. На самом деле, это очень много по конструкции не симметрично. Вот почему я не люблю называть это даже удаленно напоминает равенства. Это также объясняет, почему Я думаю, это должно было называться как-то иначе~~~или что-то еще.
Спасибо за ваше редактирование Джейкоб, я собирался вызвать вас;) я все равно опубликую пару примеров. Реализация = = = отличается в зависимости от типа. Например:
(1...3) === 2 => true /test/ === "this is a test" => true case 'test' when /blah/ "Blach" when /test/ "Test" else "Fail" end => "Test"Стивен, проверка http://ruby-doc.org/docs/ProgrammingRuby/ ("Кирка"), он должен быть в состоянии помочь вам с такими вопросами, как это в будущем.
в Ruby, The
===оператор используется для проверки равенства внутриwhenпунктcaseзаявление. В других языках, это верно.насколько мне известно, у Руби нет верно операторов все они методы которые вызываются на LHS выражения, передавая в RHS выражения. Так что, действительно, Вы можете переопределить любой "оператор", который вы хотите в своих классах, чтобы выполнять все, что вы хотите (аналогично оператору перегрузка в C++).
Comments