加載特定文件時是否有禁用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. 宏重新定義警告
- 4. 宏重新定義警告
- 5. 警告:「IPPROTO_TCP」重新定義警告:這是以前的定義
- 6. 如何在沒有警告的情況下重新定義Ruby常量?
- 7. 如何禁用 「警告:javax.ejb.EJBException異常」
- 8. 如何暫時禁用「返回值可能未定義」警告?
- 9. Xcode警告:'__IPHONE_OS_VERSION_MIN_REQUIRED'宏重新定義
- 10. 如何禁用然後重新啓用警告?
- 11. BOOST_concept在使用boost圖庫時重新定義了警告
- 12. 從Servlet下載文件 - Chrome警告+下載後如何重定向用戶?
- 13. 如何禁用SystemC運行時警告?
- 14. 如何禁用#pragma警告?
- 15. 如何禁用python警告
- 16. 如何禁用keras警告?
- 17. 禁用Flex運行時綁定警告
- 18. Ruby - 禁止常量重定義
- 19. 如何禁止特定的MSBuild警告
- 20. PHP的警告:DOM文檔:: loadHTML():屬性ALT重新定義
- 21. GCC如何強制重新定義警告錯誤
- 22. pylint的:禁用特定的警告針對特定文件夾
- 23. 禁用綁定警告
- 24. 條件宏的#define - 造成:「功能」重新定義警告
- 25. 禁用崇高的文本文件重新加載對話框
- 26. 方法在運行Merb時重新定義警告0.9.3
- 27. 重新加載自定義控件
- 28. 從Octave .oct文件中禁用警告
- 29. VSCode禁用大文件夾警告
- 30. 禁用張量流量級別警告。
修復代碼真的不合適嗎? – sarnold 2012-02-10 23:27:51
警告通常表示非致命**錯誤**,應該修復。在這種情況下,你很可能有一個應該修復的真正問題。 – 2012-02-10 23:29:35
您不止一次初始化您的變量。 – 2012-02-10 23:34:40