gpt4 book ai didi

ruby - 平等?重新定义 Object#hash 后的行为

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:56 29 4
gpt4 key购买 nike

Ruby API说:

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

我更改了 Object 的哈希方法:

class Object
def hash
1
end
end

Object.new.hash == Object.new.hash
# => true

Object.new.eql? Object.new
# => false

我不明白为什么第二条语句返回false;根据上面的 Ruby Object API,它应该返回 true

最佳答案

这不是文档所说的,“相同的哈希键”与您发布的代码并不真正相关。

hash 创建一个哈希键,暗示 a.eql?(b) 意味着 a.hash == b.hash。这不同于破坏 hash 并期望未修改的 eql? 以您期望的方式工作。

eql? 必须被覆盖以提供您想要的语义,例如,自定义类可以覆盖 eql? 以提供特定于域的等效性。如果您希望其他代码正常工作,仍然需要遵循上述 hash 契约(Contract)含义。

(这类似于 Java 口头禅“如果覆盖 equals,则覆盖 hashCode,例如 http://www.xyzws.com/javafaq/why-always-override-hashcode-if-overriding-equals/20。)

关于ruby - 平等?重新定义 Object#hash 后的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23911510/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com