今日、私はRuby定数に関する厄介な問題に出くわしました。私たちのチームでは、複数のモデルに含まれるモジュールを誰かが作成しました。として:
/home/ayrton/project/lib/life_cycle.rb:5:警告:定数RESETがすでに初期化されています
これを解決する1つの方法は、次のように定数を宣言することです。
module LifeCycle
unless (const_defined?(:RESET))
RESET = 'reset'
end
#...
end
また、Avdi Grimmが書いたブログ記事も読んでいますが、これは代替案を提供しています solution .
今日、この同じ問題に遭遇し、簡単な解決策を見つけました。
警告は同じ値を持つ定数を再割り当てしようとすることによるものなので、変更しました
module LifeCycle
RESET = 'reset'
end
に
module LifeCycle
RESET ||= 'reset'
end
これは警告を処理し、各定数が定義されているかどうかをチェックするよりもはるかに簡単です。より良い解決策を見つけたら教えてください。
これは、Rails applications。
冗長性が気分を害する場合は、代わりにunless
をステートメント修飾子として使用できます。
module LifeCycle
RESET = 'reset' unless const_defined?(:RESET)
end
これは、メソッドのみを使用するというAvdiの提案に対するいくつかの弱い議論を残します。
これらを無視するのに十分なAvdiの提案が気に入った場合は、そのままにしてください。
RESETは、コード内で変化し続ける場合、定数ではありません。名前を小文字の「リセット」に変更すると、問題はなくなります。 Rubyは大文字変数は定数であると考えているため、定数が変更されたことを警告するエラーを表示します。