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?
What is a class in Ruby? Classes are the basic building blocks in Object-Oriented Programming (OOP) & they help you define a blueprint for creating objects. Objects are the products of the class.
What is the difference between a class and a module? Modules are collections of methods and constants. They cannot generate instances. Classes may generate instances (objects), and have per-instance state (instance variables).
There are two standard approaches for defining class method in Ruby. The first one is the “def self. method” (let's call it Style #1), and the second one is the “class << self” (let's call it Style #2). Both of them have pros and cons.
ancestors is a class method in Ruby that returns an array of classes and modules commonly known as the ancestors chain. The order of the elements in this array are listed in a hierarchy of increasing parent rank. puts String.ancestors# => [String, Comparable, Object, Kernel, BasicObject]
For that you need to see how the Ruby object model looks.
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With