【发布时间】:2014-02-25 13:09:27
【问题描述】:
在 Ruby 中,获取类Foo 的特征类很简单
eigenclass = class << Foo; self; end
#=> #<Class:Foo>
eigenclass = Foo.singleton_class #2.1.0
#=> #<Class:Foo>
我对逆运算感兴趣:从 eigenclass 本身获取 eigenclass 的所有者:
klass = eigenclass.owner
#=> Foo
我不确定这是否可能,因为 eigenclass 是 Class 的匿名子类,所以 Foo 在其继承层次结构中没有出现。检查 eigenclass 的方法列表也不令人鼓舞。 eigenclass.name 返回nil。唯一让我希望这是可能的:
Class.new # normal anon class
#=> #<Class:0x007fbdc499a050>
Foo.singleton_class
#=> #<Class:Foo>
很明显,本征类的to_s 方法知道一些关于所有者的信息,即使在本征类被实例化时该信息是硬编码的。因此,我知道的唯一方法是一些 hacky Object.const_getting 之类的
Object.const_get eigenclass.to_s[/^#\<Class\:(?<owner>.+)\>$/, :owner]
#=> Foo
【问题讨论】:
-
更简洁:给定
"foo".singleton_class的值,我们怎样才能回到"foo"?
标签: ruby class metaprogramming eigenclass