ruby哈希值,为什么会被覆盖?

问题描述 投票:0回答:1

请看下面的代码片段。

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={},问题就解决了。

ruby loops hash
1个回答
1
投票

当你这样做的时候。

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)
© www.soinside.com 2019 - 2024. All rights reserved.