web-dev-qa-db-ja.com

ファイルのロード時に定数を再定義するための警告を無効にする方法

特定のファイルをロードするときにwarning: already initialized constantを無効にする方法はありますか?

31
sawa

警告を抑制するには、スクリプトの先頭にある次のコードを使用します。

$VERBOSE = nil
10
Bharat

問題の解決策は、問題の原因によって異なります。

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'
43
user2398029

これを試して :

Kernel::silence_warnings { MY_CONSTANT = 'my value '}
24
NNA

この質問 に対する受け入れられた答えは役に立ちました。 Railsソースを調べて、次の情報を取得しました。ファイルをロードする前後に、次の行を挿入できます。

# Supress warning messages.
original_verbose, $VERBOSE = $VERBOSE, nil
    load(file_in_question)
# Activate warning messages again.
$VERBOSE = original_verbose
13
sawa