特定のファイルをロードするときにwarning: already initialized constant
を無効にする方法はありますか?
警告を抑制するには、スクリプトの先頭にある次のコードを使用します。
$VERBOSE = nil
問題の解決策は、問題の原因によって異なります。
1-コードのどこかで以前に設定された定数の値を変更しているか、既存のクラスまたはモジュールと同じ名前の定数を定義しようとしています。解決策:定数の値が変更されることが事前にわかっている場合は、定数を使用しないでください。クラス/モジュールと同じ名前の定数を定義しないでください。
2-警告を表示せずに、正当な理由で定数を再定義したい状況にあります。 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インタプリタにシャットダウンするように指示することもできます(これにより、all警告が抑制されます):
# 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'
これを試して :
Kernel::silence_warnings { MY_CONSTANT = 'my value '}
この質問 に対する受け入れられた答えは役に立ちました。 Railsソースを調べて、次の情報を取得しました。ファイルをロードする前後に、次の行を挿入できます。
# Supress warning messages.
original_verbose, $VERBOSE = $VERBOSE, nil
load(file_in_question)
# Activate warning messages again.
$VERBOSE = original_verbose