Ruby - 禁止常量重新定义

标签 ruby constants redefinition

在 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/

相关文章:

java - Aspose with RJB (Ruby Java Bridge) 不工作

c - C 中的静态 const 结构

c++ - 如何使可变 lambda 捕获列表的某些成员成为 const?

c++ - C/C++ : Optimization of pointers to string constants

c++ - 重新定义一个int错误

c++ - 重新定义 struct tm 错误。标题问题

ruby ,!!运算符(a/k/a 双爆炸)

ruby - 我可以使用 Ruby 通过 TCP 发送对象吗?

C++ 函数的错误信息重定义

ruby-on-rails - 从模型内部获取未保存的关联