Модель объекта Ruby - предки класса

Я изучаю модель объекта Ruby из книги "Метапрограммирование Ruby", и я понимаю понятие о том, как классы также являются объектами.

class A
end

A.ancestors # => [A, Object, Kernel, BasicObject]
A.class.ancestors # => [Class, Module, Object, Kernel, BasicObject]

То, что я смущен, - это то, что когда я изначально пытался использовать A.ancestors в irb, я ожидал результатов, которые я получил в A.class.ancestors, - мой мыслительный процесс был: поскольку A - класс, а класс - экземпляр класса Class, его предком является класс. Но класс не кажется предком A.

Может ли кто-нибудь очистить мое замешательство здесь?

Ответ 1

Класс A является экземпляром Class, и вы можете видеть, что через A.class

Класс экземпляра A равен A, и вы получаете доступ к нему через a = A.new; a.class

Метод ancestors показывает иерархию классов, что объект этого класса имеет (или будет иметь) его наследование.

В вашем примере есть две модели иерархии параллельных классов, и они только нападают друг на друга, потому что Ruby представляет свои классы как объекты для проверки и изменения.

Нет основополагающих причин, по которым A.class.ancestors и A.ancestors должны пересекаться вообще - кроме Ruby также есть модель с глубокими классами с простыми корнями, поэтому на практике это то, что вы увидите.

На самом деле я не нашел встречного примера, даже нуль делает это:

NilClass.ancestors
 => [NilClass, Object, Kernel, BasicObject]

NilClass.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]

Это, однако, еще более полезно:

BasicObject.ancestors
 => [BasicObject]

BasicObject.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]