为什么分配给变量常量更新

时间:2012-04-10 05:49:54

标签: ruby constants

为什么当我将常量赋给变量并更新它时,常量会更新为?这是预期的行为还是错误?

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"} 

2 个答案:

答案 0 :(得分:8)

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

  1. 常数A

  2. 变量b

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

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

答案 1 :(得分:3)

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

b = A.dup

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

有关详细信息,请参阅here浅层和深层副本。