gpt4 book ai didi

ruby - 匹配哈希,eql?返回 true,但 has_key?返回假

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

我使用的是 Ruby 2.2.1,遇到以下情况:

a = ... # some object
h = ... # some hash

p h.size #=> 1
p h.keys.first.hash == a.hash #=> true
p h.keys.first.eql?(a) #=> true
p h.has_key?(a) #=> false

这怎么可能?我认为哈希匹配和 eql? 返回 true 是键被视为相等的唯一条件。


编辑:这是完整的程序。但请注意, 我不是在问如何修复它——我知道如何修复。 我在问为什么 Ruby 会那样做!因为我很困惑为什么 Hash 的 API 契约在这种情况下毫无意义。

class A
attr_reader :x

def initialize(x)
@x = x
end

MY_HASH = { A.new(5) => 'foo' }

def ==(other)
@x == other.x
end

alias_method :eql?, :==

def hash
@x
end
end

a = A.new(5)
h = A::MY_HASH

p h.size #=> 1
p h.keys.first.hash == a.hash #=> true
p h.keys.first.eql?(a) #=> true
p h.has_key?(a) #=> false

最佳答案

当您创建 MY_HASH 时,A 的新 hash 函数尚未定义,因此 MY_HASH在创建其值的索引时将使用默认值。当您稍后定义一个新的散列函数时,它将更改对象的散列方式,但不会自动更新现有散列 MY_HASH 中的索引。

在为类 A 定义了新的 hash 方法之后,或者通过运行 MY_HASH.rehash 来解决我的初始化 MY_HASH

p h.has_key?(a) #=> false
A::MY_HASH.rehash
p h.has_key?(a) #=> true

关于ruby - 匹配哈希,eql?返回 true,但 has_key?返回假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29728963/

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