2013-10-23 36 views
-1

這裏是我無法理解的代碼的簡化版本:是否有可能使一個常數不可改變?

1.9.3p448 :004 > a = {a: 1, b: 2} 
=> {:a=>1, :b=>2} 
1.9.3p448 :005 > b = a 
=> {:a=>1, :b=>2} 
1.9.3p448 :006 > b[:c] = 3 
=> 3 
1.9.3p448 :007 > a 
=> {:a=>1, :b=>2, :c=>3} 
1.9.3p448 :008 > 

我不明白爲什麼a變化。 只想改變b,並保持與a其原始值。

回答

0

編輯︰ 再次看看這個問題,它來到我爲什麼這是發生在第一個地方: 你實際上只分配一個引用到你的本地變量。然後在本地更改值也會更改原始散列內的值。您可能想嘗試.dup以獲取值的副本。 雖然它只是一個淺的副本,所以取決於你可能在那裏的物體,它可能不完全工作。

原文:

您可以使用freeze以防止它被改變。如果應用了更改,則會引發RuntimeError。它仍然沒有100%的保護,但它會保持意外的變化發生。

CONSTANT = {:key1 => 'some value', :key2 => 'some other value'}.freeze 

在這裏看到的文檔: http://www.ruby-doc.org/core-2.0.0/Object.html#method-i-freeze

而且隨着限制的咆哮在這裏: http://m.onkey.org/ruby-i-don-t-like-3-object-freeze

+0

是的,你說得對。 'dup'解決了它。然而,這個問題對我來說似乎仍然很奇怪 –

+1

請注意,'freeze'也很淺,因此可以防止mod到主對象,但不會引用包含的對象。 'H = {A 1,B:2,C:[1,2]}。凍結; h2 = h' h2 [:a] = 11'或'h2 [:d] = 4'會引發RuntimeError,但h2 [:c] << 4'會修改引用的數組:=>'{ :a => 1,:b => 2,:c => [1,2,4]} – dbenhur

相關問題