加载特定文件时是否有禁用warning: already initialized constant
的方法?如何禁用加载文件时重新定义常量的警告
24
A
回答
5
禁止警告,在脚本的顶部使用下面的代码:
$VERBOSE = nil
12
对this question的接受答案很有帮助。我查看了Rails源代码以获得以下内容。加载文件之前和之后,我可以插入以下行:
# Supress warning messages.
original_verbose, $VERBOSE = $VERBOSE, nil
load(file_in_question)
# Activate warning messages again.
$VERBOSE = original_verbose
+0
工作。我应该为它写一个包装。 – Dorian 2014-10-13 22:39:14
39
问题的解决方案取决于导致它的原因。
1 - 您正在更改在代码中的某个位置之前设置的常量的值,或者尝试使用与existant类或模块相同的名称定义常量。解决方案:如果事先知道常数值会改变,请不要使用常数;不要定义与class/modules同名的常量。
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
或者,你可以直接告诉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'
15
试试这个:
Kernel::silence_warnings { MY_CONSTANT = 'my value '}
相关问题
- 1. 在重新定义时暂时禁用gcc警告
- 2. 宏重新定义警告
- 3. 警告:“IPPROTO_TCP”重新定义警告:这是以前的定义
- 4. 如何在没有警告的情况下重新定义Ruby常量?
- 5. 如何禁用 “警告:javax.ejb.EJBException异常”
- 6. 如何暂时禁用“返回值可能未定义”警告?
- 7. BOOST_concept在使用boost图库时重新定义了警告
- 8. 如何禁用然后重新启用警告?
- 9. 如何禁用SystemC运行时警告?
- 10. 如何禁用#pragma警告?
- 11. 如何禁用keras警告?
- 12. Ruby - 禁止常量重定义
- 13. 禁用Flex运行时绑定警告
- 14. PHP的警告:DOM文档:: loadHTML():属性ALT重新定义
- 15. 如何禁止特定的MSBuild警告
- 16. 条件宏的#define - 造成:“功能”重新定义警告
- 17. 禁用绑定警告
- 18. 禁用崇高的文本文件重新加载对话框
- 19. 方法在运行Merb时重新定义警告0.9.3
- 20. 重新加载自定义控件
- 21. VSCode禁用大文件夹警告
- 22. 如何禁用页面刷新或重新加载时重新提交数据
- 23. 禁用张量流量级别警告。
- 24. 如何禁用派生的IMarketBillingService.java文件中的eclipse警告?
- 25. 使用premake5禁用特定文件的所有警告
- 26. 如何在动态创建标签时禁用重新加载?
- 27. 为什么当使用定义的常量时,__autoload会给我e_notice警告?
- 28. 如何禁用Eclipse中的只读文件警告?
- 29. 如何禁用包含文件夹的警告?
- 30. 如何仅禁用生成文件的“警告为错误”? (MSBuild)
修复代码真的不合适吗? – sarnold 2012-02-10 23:27:51
警告通常表示非致命**错误**,应该修复。在这种情况下,你很可能有一个应该修复的真正问题。 – 2012-02-10 23:29:35
您不止一次初始化您的变量。 – 2012-02-10 23:34:40