2015-07-21 57 views
0

我試圖在數組中添加改性元素:爲什麼更改數組中的複製元素會影響原始元素?

mm = Array.new 
mm.push({'a' => 1}) 
mm.unshift(mm[0]) 
mm[0]['b'] = 2 
mm #=> [{'a' => 1, 'b' => 2}, {'a' => 1, 'b' => 2}] 

我的預期是什麼:

mm #=> [{'a' => 1, 'b' => 2}, {'a' => 1}] 

誰能告訴我在哪裏,我錯了嗎?

+2

什麼是真正克隆? – philipp

+1

你用'clone'標記了這個問題,但沒有使用它。使用'clone'可以給你預期的結果。 –

+0

提示:'mm.unshift(毫米[0] .clone)' – Stefan

回答

1

您希望通過值來引用變量。在紅寶石中,這不是事實。一切都參考引用。爲了簡化,

▶ h = { a: 1 } 
#⇒ { :a => 1 } 
▶ h_another_ref = h 
#⇒ { :a => 1 } 
▶ h_another_ref[:b] = 42 
▶ h 
#⇒ { :a => 1, :b => 42 } 

在這裏,既hh_another_ref指代相同的對象

爲了達到所期望的行爲,你實際上可能clone對象(Object#dup or Object#clone):

▶ h = { a: 1 } 
#⇒ { :a => 1 } 
#     ⇓⇓⇓⇓ 
▶ h_another_inst = h.dup 
#⇒ { :a => 1 } 
▶ h_another_inst[:b] = 42 
▶ h 
#⇒ { :a => 1 } 
▶ h_another_inst 
#⇒ { :a => 1, :b => 42 } 
+1

我不當然,如果你的比喻有助於理解問題。 – sawa

+1

我也沒有。讓我們等待OP的意見。 – mudasobwa

+0

我認爲這是誤導,改變一個電話號碼不會改變另一個。 – Stefan

1

您修改了mm[0],這是與mm[1]相同的哈希實例。期望修改mm[0]而不修改mm[1]是錯誤的。

相關問題