An ancestor chain in Ruby on Rails refers to the path of inheritance leading up to a given class or module. Understanding ancestor chains goes deeper into Ruby’s core functionality. By tracing the ancestor chain of a class or module, you can better understand its relationships to other parts of their application and to Ruby itself.
Let’s take the Hash
object itself and explore its ancestor chain by using the ancestors
method.
1
puts Hash.ancestors
This will output an array of classes and modules that make up the ancestor chain for the Hash
class.
1
[Hash, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject]
This means that Hash
inherits from Enumerable
, which in turn inherits from Object
, and so on. Each class or module in the ancestor chain provides additional functionality or behavior that is inherited by Hash
.
For example, because Hash
includes the Enumerable
module in its ancestor chain, we can use methods like each
, map
, and reduce
on a Hash
object. Here’s an example:
1
2
3
4
5
my_hash = { a: 1, b: 2, c: 3 }
my_hash.each do |key, value|
puts "Key: #{key}, Value: #{value}"
end
This will output:
1
2
3
Key: a, Value: 1
Key: b, Value: 2
Key: c, Value: 3
Here’s a breakdown of the other ancestors in the Hash
class’s ancestor chain:
Object
: this is the root class of all Ruby objects. Every class in Ruby inherits from Object
, either directly or indirectly. It provides basic functionality such as the new
method for creating instances of the class, and the ==
method for testing equality between objects.
PP::ObjectMixin
: this is a module that provides additional functionality for pretty-printing Ruby objects. It is included in the ancestor chain for the Hash
class to allow for more readable output when inspecting Hash
objects. It is also included in the ancestor chain for a number of other classes in Ruby like array
, struct
, range
and others.
Kernel
: it’s another module that is included in the ancestor chain for every class in Ruby. It provides a large number of methods that are useful across different classes, such as puts
for outputting text to the console, and raise
for raising exceptions.
BasicObject
: this is the base class for all Ruby objects, and provides only a handful of methods, such as equal?
for testing object identity. It is included in the ancestor chain for every class in Ruby to provide a consistent hierarchy.
In summary, the Hash
class’s ancestor chain includes classes and modules that provide basic functionality for all Ruby objects (Object
, Kernel
, BasicObject
), as well as specific functionality for Hash objects (Enumerable
, PP::ObjectMixin
).