为什么清除我的哈希值,也清除我的哈希数组?

时间:2011-03-21 00:37:49

标签: ruby arrays hash

ruby-1.9.2-p180 :154 > a = []
 => []
ruby-1.9.2-p180 :154 > h = {:test => "test"}
 => {:test=>"test"} 
ruby-1.9.2-p180 :155 > a << h
 => [{:test=>"test"}] 
ruby-1.9.2-p180 :156 > h.clear
 => {} 
ruby-1.9.2-p180 :157 > a
 => [{}] 

我很困惑,特别是因为我可以更改哈希的元素,而不会影响数组。但是当我清除哈希时,数组会被更新并清除其哈希内容。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:5)

当您执行a << h时,您实际上是将h的引用传递给a。因此,当您更新h时,还会看到这些更改,因为它包含引用而不是该值的副本。

为了不在a中更改,必须将克隆值h传递给。

一个例子是:

a << h.clone

答案 1 :(得分:1)

当您将该哈希添加到数组时,Ruby不会生成此哈希的副本 - 它只是将引用存储到原始变量中。因此,当您清空原始变量时,存储在数组中的引用现在引用空哈希。

如果要复制哈希元素以便不会发生这种情况,请使用Ruby的clone方法。

ruby-1.9.2-p136 :049 > h = { :test => 'foo' }
 => {:test=>"foo"}
ruby-1.9.2-p136 :050 > a = []
 => [] 
ruby-1.9.2-p136 :051 > a << h.clone
 => [{:test=>"foo"}] 
ruby-1.9.2-p136 :052 > h.clear
 => {} 
ruby-1.9.2-p136 :053 > a
 => [{:test=>"foo"}]