3

为什么当我将常量分配给变量并对其进行更新时,常量被更新为?是预期的行为还是错误?

ruby-1.9.3-p0 :001 > A = { :test => '123' }
 => {:test=>"123"} 
ruby-1.9.3-p0 :002 > b = A
 => {:test=>"123"} 
ruby-1.9.3-p0 :003 > b[:test] = '456'
 => "456" 
ruby-1.9.3-p0 :004 > A
 => {:test=>"456"} 
4

2 回答 2

7

这是预期的行为,但为什么并不总是很明显。这是 Ruby 等语言的一个非常重要的区别。这里有三件事在起作用:

  1. 常数A

  2. 变量b

  3. 哈希{ :test => '123' }

前两种都是变量。第三个是对象。变量和对象之间的区别至关重要。变量只是对象。当您将同一个对象分配给两个变量时,它们都引用同一个对象。只创建了一个对象,因此当您更改它时,两个变量都引用更改后的对象。

于 2012-04-10T06:06:33.127 回答
3

这是因为浅拷贝机制。在您的示例中, A 和 b 实际上是对同一对象的引用。为了避免这种使用:

b = A.dup

这将使用 A 的副本初始化 b 而不是将其指向相同的哈希(即,这使用深拷贝)。

有关更多信息,请参见此处的浅拷贝和深拷贝。

于 2012-04-10T05:53:03.240 回答