gpt4 book ai didi

ruby 散列作为散列的键

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

在 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的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 1.8.6 中,散列键的散列编码算法被破坏了。

http://paulbarry.com/articles/2009/09/14/why-rails-3-will-require-ruby-1-8-7

编辑: 这是一个示例,表明 ruby​​ 不会在内部调用 .hash:

 class Hash
def hash
raise
end
end

{1=>1}.hash
RuntimeError:
from (irb):12:in `hash'
from (irb):17

h = {1=>2}
{1=>2}
h[1]
2

Ruby 1.8.6 在这方面被打破了,如果有纯 Ruby 的方式来做(比如打开 Hash,人们会这样做。它在 1.8.7 中修复了

关于ruby 散列作为散列的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5075584/

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