我在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是键被认为是相等的唯一条件。
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
答案 0 :(得分:3)
在您创建MY_HASH
时,hash
的新A
函数尚未定义,因此MY_HASH
在创建其值的索引时将使用默认值MY_HASH
。稍后定义新的哈希函数时,它将更改对象的散列方式但不会自动更新已存在的哈希MY_HASH
中的索引。
在为课程hash
定义新的A
方法或运行MY_HASH.rehash
p h.has_key?(a) #=> false
A::MY_HASH.rehash
p h.has_key?(a) #=> true
{{1}}