请看下面的代码片段。
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.clear改为inner_hash={},问题就解决了。
当你这样做的时候。
trial_hash.merge!("o_key1"=>inner_hash)
a 参考 的 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)