如何在加载文件时禁用重新定义常量的警告

saw*_*awa 30 ruby warnings constants suppress-warnings

有没有办法warning: already initialized constant在加载特定文件时禁用?

use*_*029 44

问题的解决方案取决于导致问题的原因.

1 - 您正在更改在代码中某处之前设置的常量的值,或者正在尝试定义与现有类或模块同名的常量.解决方案:如果事先知道常量的值会改变,请不要使用常量; 不要定义与类/模块同名的常量.

2 - 您处于这样一种情况:您希望在没有收到警告的情况下重新定义常量.有两种选择.

首先,你可以在重新定义之前取消定义常量(这需要一个辅助方法,因为它remove_const是一个私有函数):

Object.module_eval do
  # Unset a constant without private access.
  def self.const_unset(const)
    self.instance_eval { remove_const(const) }
  end
end
Run Code Online (Sandbox Code Playgroud)

或者,您可以告诉Ruby解释器关闭(这会抑制所有警告):

# Runs a block of code without warnings.
def silence_warnings(&block)
  warn_level = $VERBOSE
  $VERBOSE = nil
  result = block.call
  $VERBOSE = warn_level
  result
end
Run Code Online (Sandbox Code Playgroud)

3 - 您需要一个外部库来定义一个类/模块,其名称与您正在创建的新常量或类/模块冲突.解决方案:将代码包装在顶级模块命名空间中以防止名称冲突.

class SomeClass; end
module SomeModule
   SomeClass = '...' 
end
Run Code Online (Sandbox Code Playgroud)

4 - 与上面相同,但您绝对需要定义一个与gem/library类同名的类.解决方案:您可以将库的类名分配给变量,然后将其清除以供以后使用:

require 'clashing_library'
some_class_alias = SomeClass
SomeClass = nil
# You can now define your own class:
class SomeClass; end
# Or your own constant:
SomeClass = 'foo'
Run Code Online (Sandbox Code Playgroud)


小智 26

试试这个 :

Kernel::silence_warnings { MY_CONSTANT = 'my value '}
Run Code Online (Sandbox Code Playgroud)

  • 它是rails的一部分:http://api.rubyonrails.org/classes/Kernel.html#method-i-silence_warnings (9认同)
  • Ruby 2.0.0不存在此方法. (4认同)
  • 优秀的解决方案,它是rails的一部分,但您可以在您选择的文件中导入2个方法`silence_warnings`和`with_warnings`,并使用它修补`Kernel`. (2认同)
  • 如果您使用的是Rails,这可能就是您想要的. (2认同)

saw*_*awa 13

这个问题的公认答案很有帮助.我查看了Rails源代码以获得以下内容.在加载文件之前和之后,我可以插入这些行:

# Supress warning messages.
original_verbose, $VERBOSE = $VERBOSE, nil
    load(file_in_question)
# Activate warning messages again.
$VERBOSE = original_verbose
Run Code Online (Sandbox Code Playgroud)


小智 12

要禁止显示警告,请使用脚本顶部的以下代码:

$VERBOSE = nil
Run Code Online (Sandbox Code Playgroud)