为什么更改数组中复制的元素会影响原始元素?

时间:2015-07-21 07:15:56

标签: arrays ruby hash

我尝试在数组中添加修改后的元素:

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 个答案:

答案 0 :(得分:1)

您修改了mm[0],这是与mm[1]相同的哈希实例。如果在未修改mm[0]的情况下修改mm[1],那是错误的。

答案 1 :(得分: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 }