4.8. Method Name Resolution
Instance methods, singleton methods (including class methods), objects, classes, eigenclasses, modules that act as mixins, super, method_missing... How does a receiver know where to find a method? The Ruby interpreter uses a specific algorithm to look up methods. Consider the following method invocation:
[1,2,3].method1
Assume that we haven't defined method1 anywhere for that array.
Ruby will follow each step until it finds a matching method:
Look into the eigenclass of that particular instance. Is method1 defined in there?
Is there an instance method method1 defined by the Array class?
Does the mixin Enumerable, included in the class Array, have a method1?
Does the superclass of Array (that is, Object) include a method1?
Does the mixin Kernel, included by the superclass Object, include method1?
Starting from the eigenclass, and through all the classes and modules in the order presented here (eigenclass, Array, Enumerable, Object, Kernel), is method_missing defined? Yes, the first method_missing is defined by the Kernel mixin and can therefore be invoked. method_missing will raise a NoMethodError error.
If you were to run [1,2,3].length, the method name resolution algorithm would stop at the second step.
You can see the ancestor of a class, including its mixins, through the ancestors method. For example String.ancestors returns [String, Enumerable, Comparable, Object, Kernel].
Class method lookup works in almost the same manner, which is not surprising ...