【问题标题】:Why assigned to variable constant is updated为什么分配给变量常量被更新
【发布时间】:2012-04-10 05:49:54
【问题描述】:

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

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 constants


【解决方案1】:

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

  1. 常量A

  2. 变量b

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

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

【讨论】:

    【解决方案2】:

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

    b = A.dup
    

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

    有关详细信息,请参阅 here 什么是浅拷贝和深拷贝。

    【讨论】:

    • 谢谢!这就是我想知道的。
    • 这个答案根本没有提到引用可能不太好。
    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 2016-02-10
    • 2022-10-05
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多