2015-07-21 79 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]是错误的。

相关问题