basyura's blog

あしたになったらほんきだす。

Module#remove_const

スーパークラスが異なるクラスを定義すると TypeError になる。

class A < Hash  ; end
class A < Array ; end

#=> superclass mismatch for class A (TypeError)

そこで Module#remove_const

remove_const(name) -> object
  name で指定した定数を取り除き、その定数に設定されていた値を返します。
  [PARAM] name:
      String または Symbol を指定します。 
  [RETURN]
      引数で指定された定数に設定されていた値を返します。 
  [EXCEPTION] NameError:
      引数で指定された定数がそのモジュールやクラスに
      定義されていない場合に発生します。 
instance method Module#remove_const

やってみる

class A < Hash  ; end
class Object
  remove_const :A
end
class A < Array ; end

puts self       #=> main
puts self.class #=> Object

トップレベルで定義されるクラスは Object クラスの main オブジェクトに属するので、Object クラスをオープンして A クラス(定数)を削除できる(と解釈している)。