Understanding ruby .class and .ancestors methods
Asked Answered
B

1

38

I have a class defined as below

class Order
end

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

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

My question is why is it that Order.ancestors doesn't show 'Class' or 'Module' in ancestors chain? Since Order is an object of the class Class, shouldn't Order show all the ancestors of Class?

Brianbriana answered 27/9, 2013 at 7:33 Comment(0)
I
78

For that you need to see how the Ruby object model looks.

Ruby object model diagram

That means the classes created using keyword class will always be the subclass of Object by default. Class is not the superclass of your class Order, rather it is an instance of class Class.Module#ancestors will include list of modules included in mod (including mod itself) and the superclass of your class Order.

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

So if you look at the output and understand the above code,then the below should now be clear to you:

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

Now see,

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]

So if you look at the output and understand the above code, then the below should now be clear to you:

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

That said Order.ancestors is giving you the ancestors of the class Order,whereas Order.class.ancestors is giving you the ancestors of the Class.

Izawa answered 27/9, 2013 at 7:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.