В 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
Так, где я могу узнать больше ==
? Какие проверки я должен ожидать, когда я сравню два объекта с ним?
вкратце вот что вам нужно знать:
Сравнение ==
проверяет, равны ли два значения
eql?
проверяет, равны ли два значения и одного типа
equal?
проверяет, являются ли два объекта одним и тем же объектом.
Хороший блог об этом находится здесь .
на самом деле они оба просто методы == означает объект. == (другой_объект) равно? означает object.equals? (other_object)
Однако в этом случае equals используется в основном для сравнения поиска по хешу т.е. a_hash [1] не должна быть той же парой ключ-значение, что и a_hash [1.0]
HTH. -r
==
- это просто метод. Я думаю, что он очень хорошо объясняется здесь:
Обычно этот метод переопределяется в классах-потомках, чтобы обеспечить специфическое для класса значение.
вместе с примером с Numeric
.
Однако здесь есть подводный камень: поскольку ==
является методом левого операнда, не всегда безопасно предполагать, что результат a==b
должен быть таким же, как и b==a
. Особенно в тех случаях, когда a
- это вызов метода, который в динамическом языке, таком как Ruby, не всегда должен возвращать значения одного и того же типа.
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 и равен? сравнивает объекты, а не значения объектов.