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

fjnneemd  于 2023-08-04  发布在  Ruby
关注(0)|答案(4)|浏览(104)

今天我偶然发现了一个Ruby常量的棘手问题。在我们的团队中,有人创建了一个模块,该模块包含在多个模型中。在我们的(spec)测试输出中,这会导致警告消息,例如:
/home/ayrton/project/lib/life_cycle.rb:5:警告:已初始化常量RESET
解决这个问题的一种方法是,像这样声明常量:

module LifeCycle

  unless (const_defined?(:RESET))
    RESET = 'reset'
  end

  #...
end

字符串
我也读了一篇博客文章,由Avdi Grimm写的,它提供了一个替代solution,我想知道你的意见是什么,关于这件事。

zpjtge22

zpjtge221#

我今天遇到了同样的问题,找到了一个简单的解决方案。
由于警告是从试图重新分配一个常数与其相同的值,我只是改变了

module LifeCycle
  RESET = 'reset'
end

字符串

module LifeCycle
  RESET ||= 'reset'
end


这处理了警告,比检查是否定义了每个常数简单得多。如果你找到更好的解决方案,请告诉我。

pzfprimi

pzfprimi2#

这只在显式重新加载的应用程序中存在问题,比如Rails应用程序。
如果冗长冒犯了你,你可以使用unless作为语句修饰符:

module LifeCycle
  RESET = 'reset' unless const_defined?(:RESET)
end

字符串
这就留下了几个弱论据来反对Avdi只使用方法的建议:

  • 常量查找比方法查找快,
  • 常量值是在加载时定义的,而不是在(第一)请求时定义的,
  • 常量直观地表明它们不需要进行推导,并且

如果你喜欢Avdi的建议足以忽略这些,去吧。

qlckcl4x

qlckcl4x3#

如果RESET在代码中不断变化,它就不是常量。如果将其重命名为小写“reset”,问题就会消失。Ruby认为大写变量是常量,因此显示一个错误,警告您常量已更改。

h6my8fg2

h6my8fg24#

尝试bundle clean --force,然后bundle update

相关问题