今天我偶然发现了Ruby常量的棘手问题。在我们的团队中,有人创建了一个模块,该模块包含在多个模型中。在我们的(规范)测试输出中,这会产生警告消息,例如:
/home/ayrton/project/lib/life_cycle.rb:5:警告:已经初始化 常数RESET
解决这个问题的一种方法是,声明你的常量:
module LifeCycle
unless (const_defined?(:RESET))
RESET = 'reset'
end
#...
end
我还阅读了一篇由Avdi Grimm撰写的博客文章,该文章提供了另一种solution,我想知道你对此事的看法是什么。
答案 0 :(得分:104)
我今天遇到了同样的问题并找到了一个简单的解决方案。
由于警告来自尝试使用相同的值重新分配常量,我只是更改了
module LifeCycle
RESET = 'reset'
end
到
module LifeCycle
RESET ||= 'reset'
end
这会处理警告并且比检查是否定义了每个常量要简单得多。如果您找到更好的解决方案,请告诉我。
答案 1 :(得分:19)
这只是显式重新加载的应用程序中的问题,例如Rails应用程序。
如果详细程度冒犯了您,您可以使用unless
作为语句修饰符:
module LifeCycle
RESET = 'reset' unless const_defined?(:RESET)
end
这留下了一些反对Avdi建议仅使用方法的弱论点:
如果你喜欢Avdi的建议足以忽略这些,那就去吧。
答案 2 :(得分:5)
如果代码中不断变化,则RESET不是常数。如果将其重命名为小写“重置”,问题就会消失。 Ruby认为大写变量是常量,因此会显示一个错误,警告您常量已更改。
答案 3 :(得分:-3)
我在Intellij IDE中遇到了这个错误.. 这是由于变量名称以大写开头声明..将其设为小写将解决此问题..