Что делает оператор "===" в Ruby?

Возможный дубликат:
=== vs. == в Ruby

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

3 ответа

Решение

Точно так же, как с любым другим методом в Ruby (или фактически в любом объектно-ориентированном языке),

a === b

означает, что автор a Класс хочет, чтобы это значило.

Тем не менее, если вы не хотите запутать своих коллег, то соглашение таково, что === является оператором деления случая. По сути, это логический оператор, который задает вопрос " Если у меня есть ящик с надписью 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

Обратите внимание, что если вы хотите найти этот оператор, его обычно называют оператором тройного равенства, или оператором тройного равенства, или оператором равенства. Мне действительно не нравятся эти имена, потому что этот оператор не имеет абсолютно ничего общего с равенством.

В частности, можно ожидать, что равенство будет симметричным: если 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/ ("Кирка"), и в будущем он сможет помочь вам с такими вопросами.

В рубине === Оператор используется для проверки равенства в when пункт о case заявление. На других языках вышеизложенное верно.

Насколько мне известно, Ruby не имеет истинных операторов, все они являются методами, которые вызываются в LHS выражения, передавая RHS выражения. Таким образом, на самом деле вы можете переопределить любой "оператор", который вы хотите в своих классах, выполнять любую нужную вам черту (аналогично перегрузке операторов в C++).

Другие вопросы по тегам