请考虑以下代码:
@person = { :email => 'hello@example.com' }
temp = @person.clone
temp[:email].upcase!
p temp[:email] # => HELLO@EXAMPLE.COM
p @person[:email] # => HELLO@EXAMPLE.COM, why?!
# But
temp[:email] = 'blah@example.com'
p @person[:email] # => HELLO@EXAMPLE.COM
Ruby 版本是:"Ruby 2.1.0p0 (2013-12-25 修订版 44422) [i686-linux]"。
我不知道为什么会发生这种情况。请问谁能帮忙?
在克隆文档中,您可以阅读:
生成 obj 的浅拷贝 — obj 的实例变量为 复制,但不是它们引用的对象。克隆复制冻结 和 obj 的污染状态。
还要注意这一点:
此方法可能具有特定于类的行为。如果是这样,该行为 将记录在类的 #initialize_copy 方法下。
这意味着在某些类中可以重写此行为。
因此,将保留任何对象引用,而不是创建新的对象引用。所以你想要的是一个你可以使用元帅的深拷贝:
temp = Marshal.load(Marshal.dump(@person))