Операторы сравнения 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' истинно.

Вы можете найти конкретное значение === для разных классов в документации для этих классов, например, версия Range здесь (синоним для include?): http://ruby-doc.org/core/classes/Range.html#M000691