“#eql?”究竟是如何依赖“#hash”的?

How exactly does "#eql?" rely on "#hash"?

提问人:svoop 提问时间:4/15/2022 更新时间:4/15/2022 访问量:176

问:

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?Objecthash == other.hash

谢谢你的提示!

Ruby 哈希 相等

评论

0赞 TonyArra 4/15/2022
这回答了你的问题吗?equal?、eql?、=== 和 == 有什么区别?

答:

1赞 BroiSatse 4/15/2022 #1

这似乎实际上是相反的。 对于返回相同值的对象,应返回,但未定义用于比较这些值。您只需要覆盖两者。eql?truehash

eql?如果 obj 和其他引用相同的哈希键,则方法返回 true。Hash 使用它来测试成员的相等性。对于任何一对对象,其中 eql?返回 true,则两个对象的哈希值必须相等。那么有没有覆盖 eql 的子类呢?还应该适当地覆盖哈希。

评论

0赞 engineersmnky 4/16/2022
此外,文件指出:“......此函数必须具有 a.eql?(b) 表示 a.hash == b.hash...”加强了覆盖两者的必要性。Object#hash