3 равные или оператор равенства корпуса
-
13-10-2019 - |
Вопрос
В Руби 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.