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