2010-07-01 3 views
13

В чем разница между == и ===? Какой из них следует использовать, когда?Операторы сравнения Ruby? == vs. ===

+0

Там это действительно твердые ответ на это в [В чем разница между равными ?, eql ?, === и ==?] (http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and) –

ответ

0

== используются для равенства в условных операторах, как if, unless и т.д. === используются для определения равенства в case отчетности.

+3

В качестве примера, 10 не равно 1..20, но он находится в этом диапазоне. Таким образом, вы можете захотеть поместить диапазон в свой оператор case и выбрать его. Также обратите внимание, что операторы case преобразуются в b === a в выражениях типа 'case a, когда b then true end' –

22

Оба являются просто методами, называемыми объектами. Это означает, что объекты решают, что именно означает. Однако в Ruby есть соглашения о том, как они отличаются. Обычно == является более строгим, чем === - a === b будет почти всегда будет правдой, если a == b есть. Лучшее место для чтения - http://ruby-doc.org/core/classes/Object.html. Прокрутите вниз до разных разделов около == и ===. Вот некоторые из конвенций, о которых я знаю:

  • ==, при нанесении на равнинных Object с, будет только справедливо, если один точно такой же, как и другие - если они хранятся в месте же памяти (это как работает Ruby внутри). Однако, если аргументы имеют типы, отличные от Object, этот метод обычно будет переопределен.
  • equal? как == для простого Object s, но никогда не будет переопределяться подклассами.
  • === используется для:
    • в is_a? альтернативы, в обратном направлении. String === 'str' - это правда.
    • соответствующий regexes. /s[at]r*/ === 'str' - это правда.

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

+1

Хороший пример переопределения' == ', так что он делает то, что вы (вероятно) ожидаете, это строки. Сравните '==' и '.equal' для строкового литерала и переменной, указывающей на« ту же »строку. – Telemachus

Смежные вопросы