请考虑以下代码段:
inner_hash =Hash.new
trial_hash = Hash.new
inner_hash.merge!("i_key1"=>"value1")
inner_hash.merge!("i_key2"=>"value2")
puts "inner_hash #{inner_hash}"
trial_hash.merge!("o_key1"=>inner_hash)
puts "trial_hash #{trial_hash}"
inner_hash.clear
inner_hash.merge!("i_key1"=>"value3")
inner_hash.merge!("i_key2"=>"value4")
puts "inner_hash #{inner_hash}"
trial_hash.merge!("o_key2"=>inner_hash)
puts "trial_hash #{trial_hash}"
这就是它打印的内容:
inner_hash {"i_key1"=>"value1", "i_key2"=>"value2"}
trial_hash {"o_key1"=>{"i_key1"=>"value1", "i_key2"=>"value2"}}
inner_hash {"i_key1"=>"value3", "i_key2"=>"value4"}
trial_hash {"o_key1"=>{"i_key1"=>"value3", "i_key2"=>"value4"}, "o_key2"=>{"i_key1"=>"value3", "i_key2"=>"value4"}}
特别是看到最后一行打印的trial_hash。键“o_key1”的值是一个散列,其值应该是value1和value2但已被覆盖为value3和value4。理想情况下,预期的产出应该是:
inner_hash {"i_key1"=>"value1", "i_key2"=>"value2"}
trial_hash {"o_key1"=>{"i_key1"=>"value1", "i_key2"=>"value2"}}
inner_hash {"i_key1"=>"value3", "i_key2"=>"value4"}
trial_hash {"o_key1"=>{"i_key1"=>"value1", "i_key2"=>"value2"}, "o_key2"=>{"i_key1"=>"value3", "i_key2"=>"value4"}}
为什么会出现这种行为。我做错了什么。最初的问题是非常广泛并使用循环,这里为了示例目的,我删除并重写了一些行。任何帮助是极大的赞赏。感谢
编辑:当我用inner_hash = {}替换inner_hash.clear时问题解决了
答案 0 :(得分:1)
当你这样做时:
trial_hash.merge!("o_key1"=>inner_hash)
inner_hash
的引用作为值。因此,只要inner_hash
发生更改,trial_hash["o_key1"]
就会相应更改,因为它们是对同一Hash
个对象的引用。
查看他们的object_id
,同样:
trial_hash["o_key1"].object_id
#=> 21676080
trial_hash["o_key2"].object_id
#=> 21676080
inner_hash.object_id
#=> 21676080
如果使用clone
:
trial_hash.merge!("o_key1"=>inner_hash.clone)