来自红宝石哈希的奇怪行为

时间:2011-06-22 09:53:21

标签: ruby hash

我从ruby的哈希中得到了一些意想不到的行为

这是问题的简化演示

estdata = ["a","b","c"]
outputHash = Hash.new({:IDs => [], :count => 0})

estdata.each do |x|
  outputHash[x][:IDs] << x
  outputHash[x][:count] +=1
end

p outputHash # => {}
p outputHash["a"] # => {:count=>3, :IDs=>["a", "b", "c"]}

首先,为什么当outputHash不为空时,第一个p输出一个空哈希?

其次,更令我沮丧和困惑的是,为什么看起来每个键都指向一个值(包含:count和:IDs键的哈希)以及我如何解决这个问题? / p>

1 个答案:

答案 0 :(得分:5)

使用Hash.new和参数,一切都将指向同一个对象。

>> h = Hash.new('hello') #=> {}
>> h[:a] #=> "hello"
>> h[:a].object_id #=> 2152871580
>> h[:b].object_id #=> 2152871580
>> h[:c].object_id #=> 2152871580

你想要的是阻止形式:

>> h = Hash.new { |h,k| h[k] = {} } #=> {}
>> h[:a].object_id #=> 2152698160
>> h[:b].object_id #=> 2152627480