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)
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)
| 归档时间: |
|
| 查看次数: |
13436 次 |
| 最近记录: |