解决恼人的“警告:已经初始化常量”的消息

今天,我已经偶然发现了一个棘手的问题与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名声明以大写开始..使小写将解决此问题..