web-dev-qa-db-ja.com

迷惑な「警告:すでに初期化された定数」メッセージの解決策

今日、私はRuby定数に関する厄介な問題に出くわしました。私たちのチームでは、複数のモデルに含まれるモジュールを誰かが作成しました。として:

/home/ayrton/project/lib/life_cycle.rb:5:警告:定数RESETがすでに初期化されています

これを解決する1つの方法は、次のように定数を宣言することです。

module LifeCycle

  unless (const_defined?(:RESET))
    RESET = 'reset'
  end

  #...
end

また、Avdi Grimmが書いたブログ記事も読んでいますが、これは代替案を提供しています solution .

63
user191766

今日、この同じ問題に遭遇し、簡単な解決策を見つけました。

警告は同じ値を持つ定数を再割り当てしようとすることによるものなので、変更しました

module LifeCycle
  RESET = 'reset'
end

module LifeCycle
  RESET ||= 'reset'
end

これは警告を処理し、各定数が定義されているかどうかをチェックするよりもはるかに簡単です。より良い解決策を見つけたら教えてください。

112
Matthew Leonard

これは、Rails applications。

冗長性が気分を害する場合は、代わりにunlessをステートメント修飾子として使用できます。

module LifeCycle
  RESET = 'reset' unless const_defined?(:RESET)
end

これは、メソッドのみを使用するというAvdiの提案に対するいくつかの弱い議論を残します。

  • 定数検索はメソッド検索よりも高速です。
  • 定数値は、(最初​​の)要求ではなく、ロード時に定義されます。
  • 定数は、導出するために作業を必要としないことを視覚的に示唆します。

これらを無視するのに十分なAvdiの提案が気に入った場合は、そのままにしてください。

20
sheldonh

RESETは、コード内で変化し続ける場合、定数ではありません。名前を小文字の「リセット」に変更すると、問題はなくなります。 Rubyは大文字変数は定数であると考えているため、定数が変更されたことを警告するエラーを表示します。

5
Luis Pizana