为什么Ruby哈希使用eql?而不是==

为什么Ruby哈希使用eql?而不是==,ruby,hash,Ruby,Hash,我在Ruby中看到了很多平等的概念 == eql? === equal? 它们都有不同的语义。对我来说,应该只有两个,一个是参考平等,另一个是价值平等。我不明白Ruby为什么需要eql?和= 我发现,这表明区别仅限于值、值和类型 具体地说,我不明白为什么Hash也需要检查类型(通常我们在=方法本身中测试它)Hash需要它的键必须支持eql?,因为它在内部需要Hash代码 例如,1==1.0为真,而1.eql?1.0为假1和1.0显然具有不同的哈希代码,因此它们不能在hash中被视为等价键。然后

我在Ruby中看到了很多平等的概念

==
eql?
===
equal?
它们都有不同的语义。对我来说,应该只有两个,一个是参考平等,另一个是价值平等。我不明白Ruby为什么需要
eql?
=

我发现,这表明区别仅限于值、值和类型


具体地说,我不明白为什么
Hash
也需要检查类型(通常我们在
=
方法本身中测试它)

Hash
需要它的键必须支持
eql?
,因为它在内部需要Hash代码


例如,
1==1.0
为真,而
1.eql?1.0
为假
1
1.0
显然具有不同的哈希代码,因此它们不能在
hash
中被视为等价键。然后
Hash
应该只使用Hash方法,而不是equals方法。是出于效率的原因,散列需要相等的概念,然后是获取散列的概念吗?因为我可以要求对象散列,然后使用它。在
1
1.0
的情况下,它们会不同,我不会将它们散列到同一个键。如果您同意
1
1.0
应该是不同的键,那么您同意在这种情况下它们不相等,对吗?因此,您没有使用
==
来比较它们,为什么不让
eql?
执行其相应的工作?不,您不能使用哈希来确定相等性。这将否定散列的全部目的。散列将较大的输入空间映射到较小的输出空间。具体来说,在Ruby的
hash
方法中,它将无限多个对象映射到有限多个
Fixnum
s。这意味着,根据鸽子洞原理,有无限多个对象具有相同的散列,但不相等。因此,你不能通过相等的散列来确定两个对象是相等的,你只能通过不相等的散列来确定两个对象是不相等的。(这与Ruby甚至编程无关,顺便说一句,这只是高中的基础数学。),我相信@Jörg只是给Dhruv的建议泼了一盆冷水,Dhruv建议应该单独使用散列值来确定两个键是否不同。看来您已经知道
==
eql?
之间的区别了。我建议你简化你的问题,让它只关注为什么
Hash
使用
eql?
,而不是
=
。是的。这些问题不是已经特别询问了哈希吗?如果你认为我可以简单地回答这个问题,建议我编辑一下。什么是
#=
?这不只是一个评论吗?@sawa。你是对的。我把它和case相等运算符弄错了。我会更正我的帖子。