在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
的hacky实现。
Object.const_get eigenclass.to_s[/^#\<Class\:(?<owner>.+)\>$/, :owner]
#=> Foo
"foo".singleton_class
的值,我们如何回到"foo"
? - David Grayson