2011-11-05 55 views
2

在Ruby中重新定义一些常量(例如,FOO = 'bar')会生成警告already initialized constantRuby - 禁止常量重定义

我试图写一个排序ReallyConstants模块,其中该代码应该有这样的行为:

ReallyConstants.define_constant(:FOO, 'bar') #=> sets the constant ReallyConstants::FOO to 'bar' 
ReallyConstants::FOO #=> 'bar' 
ReallyConstants::FOO = 'foobar' #=> this should raise an Exception 

就是不断重新定义应该产生异常。

这可能吗?

+0

[在Ruby中重新分配常量时抛出异常?](http://stackoverflow.com/questions/3023617/throw-exception-when-re-assigning-a-constant-in-ruby) –

回答

4

只是将范围限定在模块中,然后使用Module#freeze禁止对模块进行进一步的修改。

E.g.

module Really 
    CONSTANT = :foo 
    freeze 
end 

Really::CONSTANT = :bar 
-> RuntimeError: can't modify frozen Module 

请注意,这并不是指定给该常量值的可变性。为此,请使用Object#freeze

这种方法会在您的代码重新加载的环境中遇到困难,就像在Rails应用程序中一样。在那里,你必须跳过一个额外的箍环,在定义它之前检查模块是否已经被定义。

一般来说,Ruby中的防御性编程比它的价值更麻烦。你关心什么?

+0

我的目的主要是说教;我正在编写一个CONST模块,通过它你可以定义一个常量(用'CONST [:FOO] ='bar''),它将定义一个内部常量'CONST :: FOO'和一个相同的Object常量'Object: :FOO',我想让它们保持一致(但我不知道该怎么做: - /) – mdesantis