【发布时间】:2011-07-01 19:51:26
【问题描述】:
在 ruby 1.8.6 中遇到以下奇怪的行为,在 1.8.7 中它似乎工作正常。有谁知道这是什么原因造成的?
h = {}
key_1 = {1 => 2}
key_2 = {1 => 2}
h[key_1] = 3
p key_1 == key_2 # => true
p h.has_key?(key_2) # => expect true, get false, wtf?
我还以为是在 Hash 类上实现了 hash 方法造成的。
p [key_1.hash, key_2.hash] # => [537787070, 537787060] (different)
但是即使我重写了Hash的散列方法
class Hash
def hash
return self.keys.hash + self.values.hash
end
end
p [key_1.hash, key_2.hash] # => [8,8] (same
p h.has_key?(key_2) # => false
在线 ruby 1.8.6 解释器结果的键盘链接:http://codepad.org/7nCYMP4w
【问题讨论】:
-
您正在覆盖的代码没有按照您的想法执行。当 ruby 访问和散列事物时,它使用的是 ruby 本身的 C 代码。为了证明这一点,请尝试在覆盖#hash 时引发异常。它没有被调用。