3 оператора равенства или равенства

В рубине Integer === 5 возвращается true, так же String === "karthik" возвращается true,
Тем не мение, 5 === Integer возвращается false, А также "karthik" === String,
Почему оператор не коммутативный?

4 ответа

Решение

Простой ответ: потому что это не имеет смысла. Соотношение, которое описывает оператор, не является коммутативным, почему оператор должен быть?

Just look at your own examples: 5 является Integer, Но это Integer 5? Что это вообще значит?

=== является оператором случая потребления, а потребление не коммутирует.

The fact that the case subsumption operator uses equals signs, and that it is usually called the triple equals, threequals или же case equality operator is terribly unfortunate since it not only has absolutely nothing to do with equality, but it also does not conform to many of the laws that equality conforms to, such as transitivity and as you mentioned commutativity.

Для большего количества моего разглагольствования о === увидеть

Одна очень простая причина заключается в том, что is_a? отношения для классов просто не могут быть коммутативными. Рассмотрим случай, когда оба операнда являются классами:

Class === String

Это вернет истину, потому что String.is_a?(Class), тем не мение String === Class вернет ложь, потому что Class.is_a?(String) ложно, и это, конечно, так и должно быть.

Другая причина заключается в том, что семантика === зависит от его левого операнда. Это опять-таки имеет две причины: а) в ruby ​​семантика всегда зависит от левого операнда, потому что левый операнд является получателем вызова метода и б) он полезен, поэтому вы можете использовать, например, классы, диапазоны и регулярные выражения в случае утверждение с предполагаемой семантикой.

Многие операторы не являются коммутативными.

=== называется "оператором равенства случаев", потому что он вызывается, когда ветвление является случаем.

Приятно и полезно, что:

foo = 42
case foo
when Integer
  # branches here
when String
  # etc...
end

Было бы не очень полезно, если

foo = Integer
case foo
when 42
# would branch here??
when 666
# etc...
end

Обратите внимание, что в Ruby 1.9 === Оператор на процесс / лямбда будет называть этот процесс:

divisible_by_three = ->(x){x % 3 == 0}
divisible_by_three === 42 # => true

Опять же, очень полезно в case Заявление, но не сильно в обратном порядке.

нужно реализовать случай-когда сравнения

Нормально иметь некоммутативные операторы.

/ - % [] . -> ^ << >> < <= > >= && || = += -= ,

И как это происходит, === существует частично как оператор случай-когда. Это довольно сложно в Ruby, и не могло быть так, если бы его пришлось упростить до коммутативной операции.

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