2012-04-10 83 views
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"} 
+0

请注意,这也表明Ruby中的“常量”实际上并没有强制为常量。 – 2012-04-10 07:12:25

+0

[Ruby中的常量赋值错误?]可能的重复(http://stackoverflow.com/questions/3010768/constant-assignment-bug-in-ruby) – 2012-04-10 07:25:52

回答

8

这是预期的行为,但为什么并不总是显而易见的。这是Ruby等语言中的一个非常重要的区别。有三件事情在这里打球:

  1. A

  2. 变量b

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

前两个是这两种变量。第三个是对象。变量和对象之间的差异至关重要。变量只是指的是对象。当您将同一个对象分配给两个变量时,它们都指向同一个对象。只有一个对象被创建,所以当你改变它时,两个变量都会引用被改变的对象。

+0

+1提及参考与数据(“对象”)。 – 2012-04-10 07:13:18

3

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

b = A.dup 

这将初始化b相的,而不是将其指向相同的散列(即本使用深层副本)复印件。

欲了解更多信息,请参阅here浅层和深层复制是什么。

+0

谢谢!这就是我想知道的。 – p0deje 2012-04-10 06:00:54

+0

这可能不是很好,这个答案根本没有提到参考。 – 2012-04-10 07:12:51

+0

拿了点。谢谢。 – 2012-04-10 07:19:21