📖 Scenario: Imagine you are creating a Ruby class that needs to keep track of every new method added to it. This can be useful for debugging or logging purposes.
🎯 Goal: You will build a Ruby class that uses the method_added hook to print the name of each method as it is defined.
📋 What You'll Learn
Create a class called Tracker
Define the method_added hook inside the Tracker class
Add at least two instance methods to the Tracker class
Print the name of each method when it is added using method_added
💡 Why This Matters
🌍 Real World
Tracking method definitions helps developers debug code and understand how classes evolve during runtime.
💼 Career
Knowing Ruby hooks like method_added is useful for Ruby developers working on metaprogramming, frameworks, or debugging tools.
Progress0 / 4 steps
1
Create the Tracker class
Create a class called Tracker with no methods inside it.
Ruby
Hint
Use the class keyword followed by Tracker and end to define the class.
2
Add the method_added hook
Inside the Tracker class, define method_added that takes one parameter called method_name. Inside this method, print the text "Method added: #{method_name}" using puts.
Ruby
Hint
The method_added hook is a method that receives the name of the method just added as a symbol.
3
Add instance methods to Tracker
Add two instance methods inside the Tracker class: hello and goodbye. Each method should just have an empty body.
Ruby
Hint
Define instance methods with def method_name and end.
4
Run the class to see method_added output
Run the Ruby code to see the output from the method_added hook printing the names of the methods hello and goodbye.
Ruby
Hint
Just running this code will automatically call method_added when the methods are defined.
Practice
(1/5)
1. What does the method_added hook do in Ruby?
easy
A. It runs when a class is inherited by another class.
B. It runs automatically whenever a new instance method is defined in a class.
C. It runs when a method is called on an object.
D. It runs when a module is included in a class.
Solution
Step 1: Understand the purpose of method_added
The method_added hook is a special method in Ruby that triggers automatically when a new instance method is defined inside a class.
Step 2: Compare with other hooks
Other hooks like inherited or included run on inheritance or module inclusion, not on method definition.
Final Answer:
It runs automatically whenever a new instance method is defined in a class. -> Option B
Quick Check:
method_added triggers on method definition [OK]
Hint: Remember: method_added triggers on new instance methods [OK]
Common Mistakes:
Confusing method_added with inherited or included hooks
Thinking it runs when methods are called
Assuming it triggers on class creation
2. Which of the following is the correct way to define a method_added hook inside a Ruby class?
easy
A. def self.method_added(method_name); puts "Added: #{method_name}"; end
B. def self.method_added; puts "Added method"; end
C. def method_added(method_name); puts "Added: #{method_name}"; end
D. def method_added; puts "Added method"; end
Solution
Step 1: Identify the correct method signature
The method_added hook is an instance method of the class's singleton class, so it should be defined as an instance method inside the class (not a class method). It receives the method name as a symbol.
Step 2: Check the options
def method_added(method_name); puts "Added: #{method_name}"; end defines def method_added(method_name) which is correct. def self.method_added(method_name); puts "Added: #{method_name}"; end defines it as a class method (self.method_added), which is incorrect. Options B and C miss the required parameter.
Final Answer:
def method_added(method_name); puts "Added: #{method_name}"; end -> Option C
Quick Check:
method_added is an instance method with one parameter [OK]
Hint: Define method_added as instance method with one parameter [OK]
Common Mistakes:
Defining method_added as a class method
Omitting the method_name parameter
Using wrong method signature without parameters
3. What will be the output of the following Ruby code?
class Test
def method_added(name)
puts "Method added: #{name}"
end
def hello
puts 'Hello world'
end
end
Test.new.hello
medium
A. Method added: hello
Hello world
B. Hello world
C. Method added: hello
D. No output
Solution
Step 1: Trace the class definition
During class definition, def method_added is processed first; the hook for defining method_added itself does not print as it is not yet active. Then def hello triggers Test.method_added(:hello), printing "Method added: hello".
Hook triggers for methods defined after method_added [OK]
Hint: method_added hook triggers during class def for subsequent methods [OK]
Common Mistakes:
Thinking method_added as instance method does not hook
Forgetting hook triggers at class definition time
Expecting only "Hello world"
4. Identify the error in this Ruby code using method_added hook:
class Demo
def method_added(name)
puts "Added: #{name}"
def new_method
puts 'New method called'
end
end
def test
puts 'Test method'
end
end
Demo.new.new_method
medium
A. Infinite recursion caused by defining a method inside method_added
B. Syntax error due to missing end keyword
C. No error; code runs and prints 'New method called'
D. new_method is private and cannot be called
Solution
Step 1: Analyze method_added behavior
Inside method_added, a new method new_method is defined. Defining a method triggers method_added again, causing infinite recursion.
Step 2: Understand the recursion effect
This recursion never ends, leading to a SystemStackError (stack overflow) at runtime.
Final Answer:
Infinite recursion caused by defining a method inside method_added -> Option A
By setting a flag (e.g., a class variable) before defining methods inside the hook and checking it at the start of method_added, you can skip the hook logic during internal method definitions.
Step 3: Implement safe tracking
This approach allows tracking new methods safely without recursion.
Final Answer:
Use a guard variable to skip method_added logic when defining methods inside the hook -> Option D
Quick Check:
Guard variable prevents recursion in method_added [OK]
Hint: Use a flag to skip method_added during internal method definitions [OK]
Common Mistakes:
Not using a guard variable and causing recursion
Trying to remove method_added dynamically
Misusing alias_method to fix recursion
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.