为什么当我将常量赋给变量并更新它时,常量会更新为?这是预期的行为还是错误?
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 :(得分:8)
这是预期的行为,但为什么并不总是很明显。这是Ruby等语言中非常重要的区别。这里有三件事:
常数A
变量b
哈希{ :test => '123' }
前两种是变量。第三个是对象。变量和对象之间的区别至关重要。变量只是引用对象。将同一对象分配给两个变量时,它们都引用同一个对象。只创建了一个对象,因此当您更改它时,两个变量都会引用已更改的对象。
答案 1 :(得分:3)
这是因为浅拷贝机制。在您的示例中,A和b实际上是对同一对象的引用。为了避免这种用途:
b = A.dup
这将使用A的副本初始化b,而不是将其指向相同的散列(即,这使用深拷贝)。
有关详细信息,请参阅here浅层和深层副本。