2013-09-27 3 views
20

У меня есть класс, определенный как нижеПонимание рубин .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 показывать всех предков класса?

ответ

47

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

Ruby object model diagram

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

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.

Смежные вопросы