3 Оператор Equals или Equ Equality

17

В Ruby Integer === 5 возвращает true . Аналогично String === "karthik" возвращает true .
Однако 5 === Integer возвращает false . И "karthik" === String .
Почему оператор не коммутативен?

    
задан karthiks 24.12.2010 в 17:11
источник

4 ответа

31

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

Просто посмотрите на свои собственные примеры: 5 - Integer . Но Integer a 5 ? Что означает это даже означает ?

=== - оператор предположения о , а предположение не коммутирует.

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

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

ответ дан Jörg W Mittag 24.12.2010 в 22:45
источник
6

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

Class === String

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

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

    
ответ дан sepp2k 24.12.2010 в 17:17
источник
2

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

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

Хорошо и полезно, чтобы:

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 , но не так много в обратном порядке.

    
ответ дан Marc-André Lafortune 24.12.2010 в 19:01
источник
1

ему нужно реализовать case-при сравнении

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

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

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

    
ответ дан DigitalRoss 24.12.2010 в 18:56
источник