What is last-in-wins principle in Ruby?
The last-in-wins principle is a key concept in Ruby regarding method resolution in the method lookup path, particularly when it comes to modules and classes that define methods with the same name. Here’s how it works:
Explanation of Last-in-Wins Principle
When Ruby encounters a method call, it follows the method lookup path, which is the order in which it checks classes and modules for the method definition. If it finds multiple methods with the same name along that path, Ruby will prioritize the method that was defined most recently—hence the term “last-in-wins.”
How It Works
- Module Inclusion Order: When modules are included in a class, the order of inclusion matters. If two modules define a method with the same name, the method from the module that was included last will be the one that is called.
- Class Inheritance: If a subclass and its superclass both define a method with the same name, the subclass’s method takes precedence, regardless of the order of method definitions. However, if a module is included in both classes, the last one included in the subclass will override the method from the superclass.
Example of Last-in-Wins Principle
Here’s a simple example to illustrate the principle:
module A
def greet
"Hello from Module A"
end
end
module B
def greet
"Hello from Module B"
end
end
class Parent
include A
end
class Child < Parent
include B
end
child = Child.new
puts child.greet # Output: "Hello from Module B"
Breakdown of the Example
- The
Parentclass includesModule A, which defines agreetmethod. - The
Childclass inherits fromParentand includesModule B, which also defines agreetmethod. - When
child.greetis called, Ruby looks up the method:
- It first checks the
Childclass and finds thatgreetis defined inModule B. - Since
Module Bwas included last, itsgreetmethod is called, resulting in “Hello from Module B.”
Practical Implications
- Method Overriding: When designing classes and modules, be mindful of the last-in-wins principle. If a method is defined in multiple places, the most recently defined one will be used, which can lead to unexpected behavior if not properly managed.
- Mixins and Composition: This principle is especially relevant when using mixins. Developers need to consider the order of module inclusion to ensure that the correct method is called when there are conflicts.
- Maintenance and Readability: Code that relies heavily on the last-in-wins principle can become difficult to maintain and understand. Clear documentation and method naming conventions can help mitigate confusion.
Conclusion
The last-in-wins principle is a fundamental aspect of Ruby’s method resolution mechanism. Understanding how method lookup works, along with the implications of this principle, allows developers to write cleaner, more predictable code, especially when using modules and inheritance.


