The method lookup chain shows how Ruby finds the code to run when you call a method on an object. It helps understand which method runs if many have the same name.
Method lookup chain in Ruby
object.method(:method_name).owner
This code shows which class or module owns the method Ruby will run.
You can also use Module#ancestors to see the full lookup chain.
hello method called on b is owned by class B, because B overrides A's method.class A def hello puts 'Hello from A' end end class B < A def hello puts 'Hello from B' end end b = B.new p b.method(:hello).owner
greet method comes from module M included in class C.module M def greet puts 'Hi from M' end end class C include M end c = C.new p c.method(:greet).owner
to_s is owned by Ruby's Object class, because D does not define it.class D end d = D.new p d.method(:to_s).owner
This program shows which speak method runs when called on child. It also prints the owner of the method and the full method lookup chain for class Child.
module M1 def speak puts 'Speak from M1' end end module M2 def speak puts 'Speak from M2' end end class Parent def speak puts 'Speak from Parent' end end class Child < Parent include M1 include M2 end child = Child.new child.speak p child.method(:speak).owner p Child.ancestors
The method lookup chain starts from the object's class, then checks included modules in reverse order of inclusion, then parent classes.
Modules included later override methods from modules included earlier.
You can use ancestors to see the full chain Ruby uses to find methods.
The method lookup chain shows where Ruby finds a method to run.
It helps understand method overriding and module inclusion order.
Use object.method(:name).owner and Class.ancestors to explore it.
Practice
What does the method lookup chain in Ruby represent?
Solution
Step 1: Understand method lookup chain meaning
The method lookup chain is the path Ruby follows to find a method when called on an object.Step 2: Compare options with definition
Only The order Ruby searches to find a method to execute correctly describes this as the order Ruby searches for a method to execute.Final Answer:
The order Ruby searches to find a method to execute -> Option BQuick Check:
Method lookup chain = method search order [OK]
- Confusing method lookup with variable list
- Thinking it shows method call sequence
- Mixing lookup with code compilation order
Which Ruby code correctly shows the method owner for to_s called on a string?
"hello".method(:to_s).owner
Solution
Step 1: Recall where
Theto_sis defined for Stringto_smethod for String objects is actually defined in the Kernel module, which is included in Object, and thus available to String.Step 2: Check method owner for
Usingto_son a String object"hello".method(:to_s).ownerreturns Kernel because String does not overrideto_s.Final Answer:
Kernel -> Option DQuick Check:
to_s owner for String = Kernel [OK]
- Assuming method is owned by String
- Confusing Object and BasicObject
- Forgetting Kernel defines to_s
Given this Ruby code, what is the output?
module M1 def greet; "Hello from M1"; end end class C include M1 def greet; "Hello from C"; end end obj = C.new puts obj.greet
Solution
Step 1: Understand method lookup order with include and override
Class C includes module M1, but also defines its owngreetmethod, which overrides the module's method.Step 2: Determine which greet method is called
Ruby looks first in C, findsgreetthere, so it calls "Hello from C".Final Answer:
Hello from C -> Option AQuick Check:
Method override in class wins over included module [OK]
- Thinking included module method runs first
- Expecting NoMethodError due to confusion
- Assuming Object's method is called
What is the error in this Ruby code snippet?
module M def hello; "Hi from M"; end end class A prepend M def hello; "Hi from A"; end end obj = A.new puts obj.hello
Solution
Step 1: Understand prepend effect on method lookup
Prepending module M places it before class A in the lookup chain, so M's methods override A's.Step 2: Determine which hello method runs
Callinghelloon obj calls M's method, outputting "Hi from M".Final Answer:
No error, output is "Hi from M" -> Option AQuick Check:
Prepend puts module before class in lookup [OK]
- Expecting class method to run instead
- Thinking prepend causes syntax error
- Confusing prepend with include
Consider this Ruby code:
module M1 def info; "M1"; end end module M2 def info; "M2"; end end class Base def info; "Base"; end end class Derived < Base include M1 prepend M2 end obj = Derived.new puts obj.info
What will be printed and why?
Solution
Step 1: Analyze method lookup order with prepend and include
Prepend M2 places it before Derived, then Derived, then included M1, then Base.Step 2: Identify which info method is called
Since M2 is first in lookup, itsinfomethod runs, printing "M2".Final Answer:
M2, because prepend puts M2 before Derived in lookup -> Option CQuick Check:
Prepend > class > include > superclass [OK]
- Thinking include module method runs first
- Assuming class method overrides prepend module
- Ignoring method lookup chain order
Ready to prove it?
Pass the test and this pattern moves unknown
