我尝试在数组中添加修改后的元素:
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}]
谁能告诉我哪里错了?
答案 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 }
此处,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 }