请考虑以下代码:
@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 revision 44422)[i686-linux]”。
我不知道为什么会这样。有人可以帮忙吗?
答案 0 :(得分:3)
在clone documentation中,您可以阅读:
生成obj的浅表副本 - obj的实例变量 复制,但不是他们引用的对象。克隆复制冻结 和被污染的状态。
还要注意这个:
此方法可能具有特定于类的行为。如果是这样,那种行为 将记录在类的#initialize_copy方法下。
这意味着在某些类中,这种行为可以被覆盖。
因此将保留任何对象引用,而不是创建新对象引用。所以你想要的是一个深层拷贝,你可以使用Marshal:
temp = Marshal.load(Marshal.dump(@person))