2012-08-29 29 views
5

Có thể viết theo cách nàyRuby không có giá trị không đổi?

class Foo 
MY_CONST = 100 
end 

và nó cũng có thể thay đổi nó Foo::MY_CONST = 123

Sẽ có một cảnh báo từ một trình biên dịch Ruby, nhưng dù sao một hằng số sẽ được thay đổi.

Vì vậy, Ruby không có giá trị không đổi?

+3

gián tiếp liên quan - http://stackoverflow.com/questions/2441524/closest-ruby-representation-of-a-private-static-final-and-public-static -final # 2442640 – dfb

+0

Cũng liên quan: http://stackoverflow.com/q/1977780/38765 –

Trả lời

3

tùy thuộc vào loại hành động bạn muốn thực hiện với các hằng số của mình.

Nếu bạn có một

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

Ruby sẽ không phàn nàn.

Tuy nhiên, nếu bạn

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

Bạn vẫn có thể

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

Chúng là hằng số ngữ nghĩa, vì vậy bạn có thể mong đợi mọi người không thay đổi chúng. Tôi muốn gọi chúng là hằng số tự do, xem http://pastie.org/4608297

+2

Chúng có thể được thay đổi. Ngay cả khi mọi người có thể không muốn thay đổi chúng. –

2

Nếu bạn freezeFOO, sau đó cố gắng để phân công lại FOO::MY_CONST sẽ tạo ra một RuntimeError.

class FOO 
    MY_CONST = 100 
end 

FOO.freeze 
FOO::MY_CONST = 123 

cho

RuntimeError: can't modify frozen Class 
Các vấn đề liên quan