2012-08-29 21 views
5

它可能寫出這樣Ruby沒有常量值?

class Foo 
MY_CONST = 100 
end 

,它也有可能去改變它Foo::MY_CONST = 123

屆時將有來自一個Ruby編譯器警告,但無論如何恆定將被改變。

那麼Ruby沒有常量值?

+3

間接關係 - http://stackoverflow.com/questions/2441524/closest-ruby-representation-of-a-private-static-final-and-public-static - 最終#2442640 – dfb

+0

也相關:http://stackoverflow.com/q/1977780/38765 –

回答

3

它取決於您想要對常量採取何種操作。

如果你有一個

ARRAY = [1,2,3] 
#and then 
ARRAY << 4 

紅寶石不會抱怨。

不過,如果你

ARRAY = [1,2,3].freeze 
#and 
ARRAY << 4 
#RuntimeError: can't modify frozen Array 

您仍然可以

ARRAY = [1,2,3,4] 
#warning: already initialized constant ARRAY 
0

它們在語義上是常量,所以你可以指望人們不要改變它們。我會稱它們爲自由常量,請參閱http://pastie.org/4608297

+2

他們可以改變。即使人們可能不想改變它們。 –

2

如果freezeFOO,然後試圖重新分配FOO::MY_CONST將創建拋出一個RuntimeError。

class FOO 
    MY_CONST = 100 
end 

FOO.freeze 
FOO::MY_CONST = 123 

RuntimeError: can't modify frozen Class