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
=> [{}]
我很困惑,特别是因为我可以更改哈希的元素,而不会影响数组。但是当我清除哈希时,数组会被更新并清除其哈希内容。有人可以解释一下吗?
答案 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"}]