9

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
4

3 に答える 3

1

使用ObjectSpace:

e = class << 'foo'; self; end

ObjectSpace.each_object(e).first    #=> 'foo'

固有クラスの内部からオブジェクトを取得するには:

class << 'foo'
  puts ObjectSpace.each_object(self).first
end

#=> 'foo'  
于 2014-02-01T21:51:15.653 に答える