解决恼人的“警告:已经初始化常量”的消息
今天,我已经偶然发现了一个棘手的问题与Ruby常量。 在我们的团队中有人创build了一个模块,包含在多个模型中。 在我们的(spec)testing输出中,这会产生警告信息,例如:
/home/ayrton/project/lib/life_cycle.rb:5:警告:已经初始化常量RESET
解决这个问题的一个方法是,像这样声明你的常量:
module LifeCycle unless (const_defined?(:RESET)) RESET = 'reset' end #... end
我还读过一篇由Avdi Grimm撰写的博客文章,它提供了一个替代解决scheme ,我想知道你的观点是什么,关于这个问题。
我今天遇到同样的问题,find了一个简单的解决scheme。
既然警告是试图用一样的价值来重新分配一个常数,我只是改变了
module LifeCycle RESET = 'reset' end
至
module LifeCycle RESET ||= 'reset' end
这照顾了警告,比检查每个常量是否被定义要简单得多。 让我知道如果你find一个更好的解决scheme。
这只是显式重新加载的应用程序中的问题,例如Rails应用程序。
如果这种冗长让你感到不快,你可以使用unless
作为语句修饰符来代替:
module LifeCycle RESET = 'reset' unless const_defined?(:RESET) end
对于Avdibuild议只使用方法,这留下了一些弱点:
- 不断的查找比查找方法快,
- 常数值是在负载上定义的,而不是(第一个)请求,
- 常量从视觉上表明,他们不需要工作来派生
如果你喜欢Avdi的build议足以忽视这些,去吧。
如果在代码中不断变化,RESET不是一个常数。 如果将其重命名为小写'重置',则问题消失。 Ruby认为大写字母variables是常量,因此显示一个错误来警告你一个常量已经改变了。
我在Ruby中得到这个错误,当Intellij IDE ..这是由于variables名声明以大写开始..使小写将解决此问题..