【问题标题】:Ruby - Forbid constants redefinitionRuby - 禁止常量重新定义
【发布时间】:2011-11-05 17:15:26
【问题描述】:

在 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

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

这可能吗?

【问题讨论】:

标签: ruby constants redefinition


【解决方案1】:

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

例如

module Really
  CONSTANT = :foo
  freeze
end

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

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

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

通常,在 Ruby 中进行防御性编程的麻烦多于其价值。你有什么顾虑?

【讨论】:

  • 我的目的主要是说教;我正在编写一个 CONST 模块,您可以通过它定义一个常量(使用CONST[:FOO] = 'bar'),它将定义一个内部常量CONST::FOO 和一个相同的对象常量Object::FOO,我想让它们保持相同(但我还不知道怎么做:-/)
猜你喜欢
  • 2019-05-27
  • 2012-12-06
  • 2015-02-09
  • 2011-12-04
  • 2011-07-14
  • 2012-01-17
  • 1970-01-01
  • 2011-03-23
  • 2018-03-15
相关资源
最近更新 更多