2

考虑以下代码:

@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]”。

我不知道为什么会这样。有人可以帮忙吗?

4

1 回答 1

3

克隆文档中,您可以阅读:

产生 obj 的浅拷贝——拷贝 obj 的实例变量,但不拷贝它们引用的对象。clone 复制 obj 的冻结和污​​染状态。

还要注意这一点:

此方法可能具有特定于类的行为。如果是这样,该行为将记录在类的 #initialize_copy 方法下。

这意味着在某些类中可以覆盖此行为。

所以任何对象引用都将被保留,而不是创建新的。所以你想要的是一个可以使用Marshal的深层副本:

temp = Marshal.load(Marshal.dump(@person))
于 2014-12-30T15:35:59.270 回答