С помощью puts A.new.eigenclass.superclass
вы фактически вызываете #eigenclass
для экземпляра класса A. Я начну с предыстории, чтобы объяснить, как на самом деле работает собственный класс, а затем перейду к рассказу о том, что происходит в вашем коде.
Предыстория:
EigenClass — это скрытый класс, который содержит одноэлементные методы, доступные только для этого конкретного объекта.
Итак, для obj = Foo.new
иерархия классов на самом деле выглядит так:
obj --eigenclass--> #> --(суперкласс)--> A
вместо:
объект --(класс)--> А
Скрытый класс может быть создан после того, как вы захватили себя с помощью #eigenclass
.
Теперь в Ruby Class является объектом. Это также означает, что #eigenclass
также должен показывать скрытый собственный класс A
(где хранятся сиглетонные методы A).
A --(собственный класс)--> # --(суперкласс)--> #
Теперь причина, по которой он показывает # вместо A
, заключается в том, что Ruby организует классы, суперклассы и собственные классы в очень красивом шаблоне. Это можно показать на примере вместо того, чтобы цитировать его запутанными словами:
A.superclass #=> Object
A.eigenclass #=> #<Class: A>
A.eigenclass.superclass #=> #<Class: Object> => Eigenclass of Object
A.eigenclass.superclass == Object.eigenclass #=> true
Суперкласс собственного класса класса – это собственный класс суперкласса исходного класса.
Теперь, что касается вашего случая: Class.new.eigenclass.superclass
, теперь это говорит само за себя. Class.new
соответствует новому анонимному классу, скажем, B
, и вы фактически вызываете для него eigenclass.superclass
. Поскольку надклассом B
является Object, надклассом собственного класса B является собственный класс надкласса B
.
Старался изо всех сил объяснить на примерах. Пожалуйста, не стесняйтесь уточнять это в комментариях ниже; соответственно обновит ответ. Дополнительно (из Pragmatic MR):
.
На рисунке выше D
наследуется от C
. Таким образом, D.eigenclass.superclass
является собственным классом (суперкласса D) [который является C]. Теперь суперклассом C является Object.. и такая же логика.
С Уважением
person
kiddorails
schedule
04.06.2014