В 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
"foo".singleton_class
, как мы можем вернуться к"foo"
? - person David Grayson   schedule 02.02.2014