我試圖在數組中添加改性元素:爲什麼更改數組中的複製元素會影響原始元素?
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}]
誰能告訴我在哪裏,我錯了嗎?
我試圖在數組中添加改性元素:爲什麼更改數組中的複製元素會影響原始元素?
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}]
誰能告訴我在哪裏,我錯了嗎?
您希望通過值來引用變量。在紅寶石中,這不是事實。一切都參考引用。爲了簡化,
▶ h = { a: 1 }
#⇒ { :a => 1 }
▶ h_another_ref = h
#⇒ { :a => 1 }
▶ h_another_ref[:b] = 42
▶ h
#⇒ { :a => 1, :b => 42 }
在這裏,既h
和h_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 }
您修改了mm[0]
,這是與mm[1]
相同的哈希實例。期望修改mm[0]
而不修改mm[1]
是錯誤的。
什麼是真正克隆? – philipp
你用'clone'標記了這個問題,但沒有使用它。使用'clone'可以給你預期的結果。 –
提示:'mm.unshift(毫米[0] .clone)' – Stefan