在 Ruby 中重新定义某个常量(例如 FOO = 'bar'
)会生成警告已初始化常量
。
我正在尝试编写一种 ReallyConstants
模块,其中此代码应该具有以下行为:
ReallyConstants.define_constant(:FOO, 'bar') #=> sets the constant ReallyConstants::FOO to 'bar'
ReallyConstants::FOO #=> 'bar'
ReallyConstants::FOO = 'foobar' #=> this should raise an Exception
也就是说,常量重定义应该生成异常。
这可能吗?
最佳答案
只需将常量范围限制在模块内,然后使用 Module#freeze
禁止进一步修改模块。
例如
module Really
CONSTANT = :foo
freeze
end
Really::CONSTANT = :bar
-> RuntimeError: can't modify frozen Module
请注意,这并不意味着分配给常量的值的可变性。为此,请使用Object#freeze
。
在重新加载代码的环境中(例如在 Rails 应用程序中),这种方法会给您带来很大的麻烦。在那里,您必须跳过一个额外的环节,在定义模块之前检查模块是否已定义。
一般来说,Ruby 中的防御性编程麻烦多于其值(value)。你担心什么?
关于Ruby - 禁止常量重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8021819/