2012年6月25日月曜日

クラスの削除

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 件のコメント:

コメントを投稿