红宝石哈希,为什么价值被覆盖

时间:2015-05-22 19:13:47

标签: ruby loops clear hash

请考虑以下代码段:

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时问题解决了

1 个答案:

答案 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)