irbやpryなどでサンプルを試したりしていると、適当なクラス名を使っていたりするため、クラスが重複することがあります。 もう1度class ... endと書いてしますと、クラスを再オープンすることになるので、思わぬ副作用に遭遇する時があります。 一度セッションを閉じるのも手ですが、remove_constを使用してクラスを削除できます。
pry(main)> class MyClass; end => nil pry(main)> Object.const_defined? :MyClass => true pry(main)> Object.class_eval {remove_const :MyClass} => MyClass pry(main)> Object.const_defined? :MyClass => false
MyClassはトップレベルに定義したクラスなので、Objectの中に定義された定数(=クラス)を削除します。 remove_constはプライベートメソッドなので明示的にレシーバを指定できません。 そのため、上記のようにclass_eval / instance_evalまたはsendメソッドで呼び出す必要があります。
pry(main)> class MyClass; end => nil pry(main)> Object.const_defined? :MyClass => true pry(main)> Object.send :remove_const, :MyClass => MyClass pry(main)> Object.const_defined? :MyClass => false
Moduleの中で定義されているクラスは、該当するModuleの中から削除します。
pry(main)> module M class MyClass; end; end => nil pry(main)> M.const_defined? :MyClass => true pry(main)> M.instance_eval {remove_const :MyClass} => M::MyClass pry(main)> M.const_defined? :MyClass => false
0 件のコメント:
コメントを投稿