Вопрос

В Руби Integer === 5 возврат true. Анкет Сходным образом String === "karthik" возврат true.
Однако, 5 === Integer возврат false. Анкет А также "karthik" === String.
Почему оператор не коммутативен?

Это было полезно?

Решение

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

Просто посмотрите на свои собственные примеры: 5 является Integer. Анкет Но это Integer а 5? Что это делает даже иметь в виду?

=== это Оператор субъекта корпуса, и субъект не переезжает.

Тот факт, что оператор субъекта корпуса использует знаки, и что он обычно называют тройной равен, threequals или же case equality оператор есть ужасно К сожалению, так как это не только совершенно ничего Сделать с равенством, но это также не соответствует многим законам, которым соответствует равенство, таким как транзитивность и, как вы упоминали о коммутативности.

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

Другие советы

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

Class === String

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

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

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

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

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

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 === Оператор на Proc/Lambda назовет это Proc:

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

Опять же, очень полезный в case утверждение, но не так много в обратном порядке.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top