Что == делает в Ruby? - PullRequest
       1

Что == делает в Ruby?

9 голосов
/ 02 августа 2010

В Java == - самый сильный вид равенства (равенство указателей): a == b всегда подразумевает a.equals(b). Однако в Ruby == слабее, чем .equals?:

ruby-1.9.2-rc2 > 17 == 17.0
 => true 
ruby-1.9.2-rc2 > 17.equal?(17.0)
 => false

Итак, где я могу узнать больше о ==? Какие проверки следует ожидать, когда я сравниваю два объекта с ним?

Ответы [ 4 ]

8 голосов
/ 02 августа 2010

Вкратце это то, что вам нужно знать:

Сравнение == проверяет, равны ли два значения

eql?, проверяет, равны ли два значения одного типа

equal? проверяет, являются ли две вещи одним и тем же объектом.

Хороший блог об этом здесь .

1 голос
/ 02 августа 2010

== - это просто метод.Я думаю, что это действительно хорошо объяснено здесь :

Как правило, этот метод переопределяется в классах-потомках для обеспечения специфического для класса значения.

вместе с примером с Numeric s.

Здесь есть подводный камень: хотя == является методом левого операнда, не всегда безопасно предполагать, что результатa==b должно совпадать с b==a.Особенно в случаях, когда a является вызовом метода, который в динамическом языке, таком как Ruby, не всегда должен возвращать значения одного и того же типа.

1 голос
/ 02 августа 2010

на самом деле они оба просто методы == означает объект. == (other_object) равно?означает object.equals? (other_object)

В этом случае, однако, equals используется в основном для сравнения с поиском хэша, т.е. a_hash [1] не должен быть той же парой значений ключа, что и a_hash [1.0]

НТН.-r

0 голосов
/ 02 августа 2010
jruby-1.5.0 > 17 ==17
 => true 
jruby-1.5.0 > 17 == 17.0
 => true 
jruby-1.5.0 > 17 === 17.0
 => true 
jruby-1.5.0 > 17.equal?(17.0)
 => false 
jruby-1.5.0 > 17.id
 => 35 
jruby-1.5.0 > (17.0).id
(irb):12 warning: Object#id will be deprecated; use Object#object_id
 => 2114 

Все в рубине - это объект. объект 17 не совпадает с объектом 17.0 и равен? сравнивает объекты, а не значения объектов.

...