Подтвердить что ты не робот

Понимание методов ruby ​​.class и .ancestors

У меня есть класс, определенный ниже

class Order
end

puts Order.class #-> Class
puts Order.ancestors #-> [Order, Object, Kernel, BasicObject]

puts Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject]

Мой вопрос: почему Order.ancestors не показывает "класс" или "модуль" в цепочке предков? Поскольку Order является объектом класса Class, не должен Order показывать всех предков класса?

4b9b3361

Ответ 1

Для этого вам нужно посмотреть, как выглядит модель объекта Ruby.

Ruby object model diagram

Это означает, что классы, созданные с использованием ключевого слова class, всегда будут подклассом Object по умолчанию. class не является суперклассом вашего класса Order, скорее это экземпляр класса class. Module#ancestors будет включать список модулей, включенных в mod (включая сам модем) и суперкласса вашего класса.

class Order;end
Order.superclass # => Object
Order.superclass.superclass # => BasicObject
Order.superclass.included_modules # => [Kernel]

Итак, если вы посмотрите на результат и понимаете приведенный выше код, то ниже вам должно быть ясно:

Order.ancestors #-> [Order, Object, Kernel, BasicObject]

Теперь посмотрим,

class Order;end
Order.class # => Class
Order.instance_of? Class # => true
Order.class.superclass # => Module
Order.class.superclass.superclass # => Object
Order.class.superclass.superclass.included_modules # => [Kernel]

Итак, если вы посмотрите на результат и понимаете приведенный выше код, то ниже вам должно быть ясно:

Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject]

Тем не менее Order.ancestors предоставляет вам предков класса Order, тогда как Order.class.ancestors дает вам предков class.