2015-04-25 3 views
2

Я вижу так много понятий равенства в Ruby.Почему хеши Ruby используют eql? а не ==

== 
eql? 
=== 
equal? 

И все они имеют разную семантику. Для меня должно быть только 2 из них, одно - это ссылочное равенство, а другое - значение равенства. Я не понимаю, зачем Ruby нужен eql? и ===.

Я нашел this question, в котором говорится, что различие касается только значения и значения и типа.

В частности, я не понимаю, почему Hash нужно будет проверять тип, а также (что обычно мы тестируем в самом == метод)

+0

Кажется, вы уже знаете различие между '==' и 'eql?'. Я предлагаю вам упростить свой вопрос, чтобы он фокусировался только на том, почему 'Hash' использует' eql? ', А не' == '. –

+0

Да. Разве не задаются вопросы о хешах? Предложите мне редактирование, если вы думаете, что я могу просто задать вопрос. –

+0

Что такое '# =='? Разве это не комментарий? – sawa

ответ

2

Hash требует ключи от него должны поддерживать eql?, поскольку он нуждается в хэш-код внутри ,

Например, 1 == 1.0 является истинным, а 1.eql? 1.0 является ложным. 1 и 1.0 явно имеют разные хэш-коды, поэтому их нельзя рассматривать как эквивалентные ключи в Hash.

+0

Да. И тогда 'Hash' должен использовать хэш-метод, а не метод equals. Это по соображениям эффективности, что хэш нуждается в понимании равенства, а затем понятие получения хэша? Потому что я могу просто попросить хэш объектов, а затем использовать его. В случае '1' и' 1.0' они будут разными, и я не буду их использовать для того же ключа. –

+0

Если вы согласны, что '1' и' 1.0' должны быть разными ключами, то вы соглашаетесь с тем, что они не равны * в этой ситуации, правильно? Поэтому вы не сравниваете их с помощью '==', почему бы не позволить 'eql?' Выполнять соответствующую работу? –

+1

Нет, вы не можете использовать хеш для определения равенства. Это отрицает всю цель хэша. Хэш отображает большее пространство ввода в меньшее пространство вывода. В частности, в случае метода 'hash' Ruby он отображает бесконечное число объектов в конечное число' Fixnum'. Это означает, что в соответствии с принципом Голубей существует бесконечно много объектов, которые имеют одинаковый хэш, но не равны. Ergo, вы не можете определить из равных хэшей, что два объекта равны, вы можете определить только из неравных хешей, что два объекта неравны. –