2012-04-10 84 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