2

在 Ruby 中重新定义一些常量(例如FOO = 'bar')会产生警告already initialized constant

我正在尝试编写一种ReallyConstants模块,该代码应该具有以下行为:

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

也就是说,常量重定义应该产生异常。

那可能吗?

4

1 回答 1

4

只需在模块内限定常量,然后用于Module#freeze禁止进一步修改模块。

例如

module Really
  CONSTANT = :foo
  freeze
end

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

请注意,这并没有说明分配给常量的值的可变性。为此,使用Object#freeze.

这种方法会在重新加载代码的环境中(例如在 Rails 应用程序中)对您造成严重影响。在那里,您必须跳过一个额外的环节,在定义模块之前检查模块是否已经定义。

一般来说,Ruby 中的防御性编程麻烦多于其价值。你有什么顾虑?

于 2011-11-05T17:47:28.587 回答