我从红宝石的哈希中得到一些相当意想不到的行为
这是问题的简化演示
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"]}
Run Code Online (Sandbox Code Playgroud)
首先,为什么第一个p输出空哈希时,显然outputHash不为空?
其次,更令我沮丧和困惑的是,为什么看起来每个键都指向一个值(包含:count和:IDs键的哈希)以及我如何解决这个问题?
使用Hash.new和参数一切都将指向同一个对象.
>> h = Hash.new('hello') #=> {}
>> h[:a] #=> "hello"
>> h[:a].object_id #=> 2152871580
>> h[:b].object_id #=> 2152871580
>> h[:c].object_id #=> 2152871580
Run Code Online (Sandbox Code Playgroud)
您想要的是块形式:
>> h = Hash.new { |h,k| h[k] = {} } #=> {}
>> h[:a].object_id #=> 2152698160
>> h[:b].object_id #=> 2152627480
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |