How to get the Ancestors of an Object's Class in Ruby
Greetings, friends! Sometimes, you may want to know the class hierarchy of an object in Ruby. We can use the Module#ancestors method to get the class an object and all of its ancestors in the inheritance chain.
class Animal
def speak
puts "Grrr"
end
end
class Cat < Animal
def speak
puts "Meow!"
end
end
cat = Cat.new
puts cat.class # Cat
p cat.class.ancestors # [Cat, Animal, Object, Kernel, BasicObject]
Technically, Module#ancestors is returning a list of modules included/prepended in a module, but we can use it to look at the class hierarchy of an object. In the code snippet above, we can see that our Cat class inherits from the Animal class, and the Animal class inherits from the Object class.
Lets look at integers, strings, booleans, and other types of objects. By calling the Module#ancestors method, we can see that each of these types inherit from Object.
puts 0.class # Integer
p 0.class.ancestors # [Integer, Numeric, Comparable, Object, Kernel, BasicObject]
puts "-------------"
puts 3.14.class # Float
p 3.14.class.ancestors # [Float, Numeric, Comparable, Object, Kernel, BasicObject]
puts "-------------"
puts "".class # String
p "".class.ancestors # [String, Comparable, Object, Kernel, BasicObject]
puts "-------------"
puts false.class # FalseClass
p false.class.ancestors # [FalseClass, Object, Kernel, BasicObject]
puts "-------------"
puts true.class # TrueClass
p true.class.ancestors # [TrueClass, Object, Kernel, BasicObject]
puts "-------------"
puts nil.class # NilClass
p nil.class.ancestors # [NilClass, Object, Kernel, BasicObject]
puts "-------------"
puts [].class # Array
p [].class.ancestors # [Array, Enumerable, Object, Kernel, BasicObject]
puts "-------------"
hash = {foo: 0, bar: 1, baz: 2}
puts hash.class # Hash
p hash.class.ancestors # [Hash, Enumerable, Object, Kernel, BasicObject]
You can also call the Module#ancestors method directly on a class instead of an instance of a class:
p Integer.ancestors # [Integer, Numeric, Comparable, Object, Kernel, BasicObject]
p Float.ancestors # [Float, Numeric, Comparable, Object, Kernel, BasicObject]
p String.ancestors # [String, Comparable, Object, Kernel, BasicObject]
p FalseClass.ancestors # [FalseClass, Object, Kernel, BasicObject]
p TrueClass.ancestors # [TrueClass, Object, Kernel, BasicObject]
p NilClass.ancestors # [NilClass, Object, Kernel, BasicObject]
p Array.ancestors # [Array, Enumerable, Object, Kernel, BasicObject]
p Hash.ancestors # [Hash, Enumerable, Object, Kernel, BasicObject]
class Animal
def speak
puts "Grrr"
end
end
class Cat < Animal
def speak
puts "Meow!"
end
end
p Animal.ancestors # [Animal, Object, Kernel, BasicObject]
p Cat.ancestors # [Cat, Animal, Object, Kernel, BasicObject]
In the previous article, we learned that we can call the Class#superclass method multiple times to investigate the class hierarchy of an object. By calling the Module#ancestors method, we can get this information much easier and quicker.