Какая разница между == и ===? Какой из них следует использовать, когда?
Операторы сравнения Ruby? == vs. ===
Ответ 1
==
используется для равенства в условных операторах типа if
, unless
и т.д. ===
используется для определения равенства в операторах case
.
Ответ 2
Оба являются просто методами, вызываемыми объектами. Это означает, что объекты решают, что именно означает. Однако в Ruby есть соглашения о том, как они отличаются. Обычно ==
более строгий, чем ===
- a === b
будет почти всегда быть истинным, если a == b
. Лучшее место для чтения - http://ruby-doc.org/core/classes/Object.html. Прокрутите вниз до различных разделов о ==
и ===
. Вот некоторые из соглашений, о которых я знаю:
-
==
, когда применяется к обычнымObject
s, будет только true, если он будет точно таким же, как и другой, - если они хранятся в одной и той же ячейке памяти (так работает Ruby внутри). Однако, если аргументы имеют типы, отличные от Object, этот метод обычно переопределяется. -
equal?
аналогичен==
для простогоObject
s, но никогда не будет переопределяться подклассами. -
===
используется для:- a
is_a?
альтернатива, назад.String === 'str'
истинно. - соответствие регулярным выражениям.
/s[at]r*/ === 'str'
истинно.
- a
Вы можете найти конкретное значение ===
для разных классов в документации для этих классов, например, версия Range
здесь (синоним для include?
): http://ruby-doc.org/core/classes/Range.html#M000691