モジュールからクラス定義を消す
remove_constでモジュールからクラス定義を消すことができます。
module Test class Foo; end end # クラス定義を消す。 # remove_constはprivateメソッドなのでsendで送る。 Test.send(:remove_const, :Foo) # 消されたクラスは利用できなくなる。 begin Test::Foo raise "あれ?" rescue NameError end begin Test::Foo.new # インスタンス化も当然エラー raise "あれ?" rescue NameError end
でも、ObjectSpaceから探すと見つかったり。蓋がされてるだけっぽいなー。
# ObjectSpaceから探すと見つかる ObjectSpace.each_object(Class) {|cl| next unless cl.name == "Test::Foo" p cl p cl.new }
実行結果です。
Test::Foo #<Test::Foo:0x10030bc8>