提问人:svoop 提问时间:4/15/2022 更新时间:4/15/2022 访问量:176
“#eql?”究竟是如何依赖“#hash”的?
How exactly does "#eql?" rely on "#hash"?
问:
Ruby 文档的内容如下:
eql?如果 obj 和其他引用相同的哈希键,则方法返回 true。
因此,为了用于比较两个对象(或将对象用作哈希键),该对象必须以有意义的方式实现。#eql?
#hash
为什么会发生以下情况?
class EqlTest
def hash
123
end
end
a = EqlTest.new
b = EqlTest.new
a.hash == b.hash # => true
a.eql? b # => false
我当然可以实现,但继承的实现不应该是已经发生的事情吗?EqlTest#eql?
Object
hash == other.hash
谢谢你的提示!
答:
1赞
BroiSatse
4/15/2022
#1
这似乎实际上是相反的。 对于返回相同值的对象,应返回,但未定义用于比较这些值。您只需要覆盖两者。eql?
true
hash
eql?如果 obj 和其他引用相同的哈希键,则方法返回 true。Hash 使用它来测试成员的相等性。对于任何一对对象,其中 eql?返回 true,则两个对象的哈希值必须相等。那么有没有覆盖 eql 的子类呢?还应该适当地覆盖哈希。
评论
0赞
engineersmnky
4/16/2022
此外,文件指出:“......此函数必须具有 a.eql?(b) 表示 a.hash == b.hash...”加强了覆盖两者的必要性。Object#hash
评论