#eql到底如何?”依靠“#hash&quot?

发布于 2025-01-21 17:33:40 字数 525 浏览 0 评论 0原文

红宝石文档读取如下:

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 == hash ==其他。 >已经?

感谢您的提示!

The Ruby docs read as follows:

The eql? method returns true if obj and other refer to the same hash key.

So in order to use #eql? to compare two objects (or use objects as Hash keys), the object has to implement #hash in a meaningful manner.

How come the following happens?

class EqlTest
  def hash
    123
  end
end

a = EqlTest.new
b = EqlTest.new

a.hash == b.hash   # => true
a.eql? b           # => false

I could of course implement EqlTest#eql? but shouldn't the implementation inherited from Object be something along the lines of hash == other.hash already?

Thanks for your hints!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世界等同你 2025-01-28 17:33:40

这似乎实际上是相反的。 eql?有望返回true返回相同hash值的对象,但没有定义以比较这些值。您简单地期望您两者都覆盖。

eql?如果OBJ和其他参考相同的哈希密钥,方法将返回true。哈希用于测试成员的平等。对于任何一对eql的对象?返回true,两个对象的哈希值必须相等。那么有没有覆盖EQL的子类?也应适当地覆盖。

This seems to be actually the other way around. eql? is expected to return true for objects returning the same hash value, but it is not defined to compare these values. You are simply expected to override both.

The eql? method returns true if obj and other refer to the same hash key. This is used by Hash to test members for equality. For any pair of objects where eql? returns true, the hash value of both objects must be equal. So any subclass that overrides eql? should also override hash appropriately.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文