日付が変わるたびにRubyファイルを評価するRubyコードを実行しています。ファイルには、次のような一定の定義があります
Tau = 2 * Pi
そしてもちろん、インタープリターに不要な「既に初期化された定数」警告を毎回表示させるので、次の機能が必要です。
def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)
次のようにすべての定数定義を記述することで、警告を回避できました。
Tau = 2 * Pi unless defined?(Tau)
しかし、それはエレガントではなく、少し濡れています(DRYではありません)。
より良い方法はありdef_if_not_defined
ますか?そしてどのようにredef_without_warning
?
--
スティーブのおかげで解決策:
class Object
def def_if_not_defined(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.const_set(const, value) unless mod.const_defined?(const)
end
def redef_without_warning(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.send(:remove_const, const) if mod.const_defined?(const)
mod.const_set(const, value)
end
end
A = 1
redef_without_warning :A, 2
fail 'unit test' unless A == 2
module M
B = 10
redef_without_warning :B, 20
end
fail 'unit test' unless M::B == 20
--
この質問は古いです。上記のコードは、Ruby 1.8 でのみ必要です。Ruby 1.9 では、P3t3rU5 の回答は警告を生成せず、単純に優れています。