2011-03-21 48 views
3
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

什麼是'a'?你必須在這裏丟失你可能在你的irb中輸入的東西。 – sawa 2011-03-21 01:18:41

回答

5

當你做a << h,你真的把h的引用傳遞給a。所以當你更新h時,a也會看到那些更改,因爲它包含引用而不是該值的副本。

爲了不在a中更改,您必須將克隆值h傳遞給a。

一個例子是:

a << h.clone 
+0

對不起,我應該清楚我的問題。我想知道爲什麼會發生這種情況,還想知道是否有一種方法可以在不影響數組的情況下使用清除方法,還是必須手動清空散列? – 2011-03-21 00:42:42

+0

完美,謝謝。 – 2011-03-21 00:45:21

+0

正如我的答案中所見,您可以克隆h(也可以在h中對數據進行新的引用),這樣您就可以清除哈希而不影響數組。 – 2011-03-21 00:45:46

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"}]