#upcase的奇怪行为!在Ruby中

时间:2014-12-30 15:10:10

标签: ruby string 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 revision 44422)[i686-linux]”。

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

1 个答案:

答案 0 :(得分:3)

clone documentation中,您可以阅读:

  

生成obj的浅表副本 - obj的实例变量   复制,但不是他们引用的对象。克隆复制冻结   和被污染的状态。

还要注意这个:

  

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

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

因此将保留任何对象引用,而不是创建新对象引用。所以你想要的是一个深层拷贝,你可以使用Marshal

temp = Marshal.load(Marshal.dump(@person))