Ruby では、クラスの固有クラスを取得するのは次のようにFoo
単純です。
eigenclass = class << Foo; self; end
#=> #<Class:Foo>
eigenclass = Foo.singleton_class #2.1.0
#=> #<Class:Foo>
私は逆の操作に興味があります: 固有クラス自体から固有クラスの所有者を取得します:
klass = eigenclass.owner
#=> Foo
固有クラスが の匿名サブクラスでClass
あるため、これが可能かどうかはわかりFoo
ません。そのため、継承階層のどこにも表示されません。固有クラスのメソッド リストを検査することも、心強いものではありません。eigenclass.name
戻りますnil
。これが可能であることを願っている唯一のこと:
Class.new # normal anon class
#=> #<Class:0x007fbdc499a050>
Foo.singleton_class
#=> #<Class:Foo>
明らかに、固有クラスがインスタンス化されるときにこの情報がハードコーディングされていても、固有クラスのto_s
メソッドは所有者について何らかの情報を知っています。したがって、私が知っている唯一の方法はObject.const_getting
、そのようなハックです
Object.const_get eigenclass.to_s[/^#\<Class\:(?<owner>.+)\>$/, :owner]
#=> Foo