作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
有没有办法在加载特定文件时禁用warning: already initialized constant
?
最佳答案
问题的解决方案取决于问题的成因。
1 - 您正在更改之前在代码中某处设置的常量的值,或者试图定义一个与现有类或模块同名的常量。解决方案:如果事先知道常量的值会发生变化,就不要使用常量;不要定义与类/模块同名的常量。
2 - 您出于充分的理由想要重新定义常量,但没有收到警告。有两种选择。
首先,您可以在重新定义常量之前取消定义常量(这需要一个辅助方法,因为 remove_const
是一个私有(private)函数):
Object.module_eval do
# Unset a constant without private access.
def self.const_unset(const)
self.instance_eval { remove_const(const) }
end
end
或者,您可以告诉 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
3 - 您需要一个外部库来定义一个类/模块,其名称与您正在创建的新常量或类/模块冲突。解决方案:将您的代码包装在顶级模块命名空间中,以防止名称冲突。
class SomeClass; end
module SomeModule
SomeClass = '...'
end
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'
关于ruby - 如何在加载文件时禁用重新定义常量的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9236264/
我是一名优秀的程序员,十分优秀!