Что делает оператор "= = = " в Ruby? [дубликат]




Возможные Дубликаты:
=== и == в Ruby






Я видел его несколько раз в последнее время, но не могу понять, что он делает. Может ли кто-нибудь проиллюстрировать, как это работает?

458   3  

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

    Ничего не найдено.