#upcase 的奇怪行为!在红宝石中



请考虑以下代码:

@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))

最新更新