2012-10-22 82 views
0

a是一個哈希值。 s是一個數組,我想迭代推送散列a。這個想法是獨立保留每個迭代推送散列的值。這是我試過的。修改散列擁有多個分身

a = {:a=> 1, :b=>2} 

s = [] 
s << a 
s << a  # => [{:b=>2, :a=>1}, {:b=>2, :a=>1}] 
a[:b] = 3 
s   # => [{:b=>3, :a=>1}, {:b=>3, :a=>1}] 

t = [] 
t.push(a) # => [{:b=>3, :a=>1}] 
t.push(a) # => [{:b=>3, :a=>1}, {:b=>3, :a=>1}] 
a[:b] = 4 
t   # => [{:b=>4, :a=>1}, {:b=>4, :a=>1}] 

上面不給我的溶液:更改a其中先前推陣列內的元件的變化的值。推動as兩次後,我改變a[:b]23,所有的元素體現了變化。對此的建議請。

+1

本質DUP的[如何複製在Ruby中的哈希?](HTTP:/ /stackoverflow.com/questions/4157399/how-do-i-copy-a-hash-in-ruby) – dbenhur

回答

2

使用

s << Hash[a] 

這將複製哈希,並允許您更改原始。

+0

同樣以'#dup'這不僅使淺表副本。如果'A'有一個元件':C => [1,2]'和複製後,他改性'一個[:C] << 3',則複製推到他的陣列也將看到變化 – dbenhur

5

使用dup每次你要添加到s

s << a.dup 

dup方法將創建哈希的淺拷貝時間。

更新:

在情況下,如果淺拷貝不符合要求,然後使用編組

s << Marshal.load(Marshal.dump(a)) 
+0

['對象#dup'](http://ruby-doc.org/core-1.9.3/Object.html#method-i-dup)只能做一個淺拷貝。如果'A'有一個元件':C => [1,2]'和複製後,他改性'一個[:C] << 3',則複製推到他的陣列也將看到變化。 – dbenhur

+0

@dbenhur,你是對的,看到更新 – megas