我从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>
答案 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