我试图在数组中添加改性元素:为什么更改数组中的复制元素会影响原始元素?
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