📖 Scenario: You are building a simple calculator program that can reuse operations easily.
🎯 Goal: Learn how to create method objects using method() and call them later.
📋 What You'll Learn
Create a method named add that takes two numbers and returns their sum.
Create a method object from the add method using method(:add).
Call the method object with two numbers to get the sum.
Print the result of calling the method object.
💡 Why This Matters
🌍 Real World
Method objects let you treat methods like data. This helps when you want to reuse or pass around actions in your programs.
💼 Career
Understanding method objects is useful for Ruby developers working on flexible code, libraries, or frameworks that need to manipulate behavior dynamically.
Progress0 / 4 steps
1
Define the add method
Write a method named add that takes two parameters a and b and returns their sum.
Ruby
Hint
Use def add(a, b) to start the method and a + b to return the sum.
2
Create a method object from add
Create a variable called add_method and assign it the method object of add using method(:add).
Ruby
Hint
Use add_method = method(:add) to get the method object.
3
Call the method object with arguments
Call the method object add_method with arguments 5 and 7 and assign the result to a variable called result.
Ruby
Hint
Use result = add_method.call(5, 7) to call the method object.
4
Print the result
Print the value of the variable result using puts.
Ruby
Hint
Use puts result to display the sum.
Practice
(1/5)
1. What does the Ruby expression obj.method(:foo) return?
easy
A. A Method object representing the method foo of obj
B. The result of calling foo on obj
C. A symbol :foo
D. An error because method is not a valid method
Solution
Step 1: Understand method usage
The method method on an object returns a Method object representing the named method.
Step 2: Identify the return type
Calling obj.method(:foo) returns a Method object, not the method's result or a symbol.
Final Answer:
A Method object representing the method foo of obj -> Option A
Quick Check:
obj.method(:foo) returns Method object [OK]
Hint: Remember: method returns a Method object, not the call result [OK]
Common Mistakes:
Thinking it calls the method immediately
Confusing with symbol :foo
Assuming it returns a string or error
2. Which of the following is the correct syntax to get a Method object for the method greet on object person?
easy
A. person.send(:greet)
B. person.method[b greet]
C. person.method(greet)
D. person.method(:greet)
Solution
Step 1: Check argument type for method
The method method expects a symbol representing the method name.
Step 2: Validate options
person.method(:greet) uses a symbol :greet, which is correct. person.send(:greet) calls the method directly, returning its result instead of a Method object. person.method(greet) passes an undefined variable greet, causing error. person.method[b greet] uses brackets, which is invalid syntax.
Final Answer:
person.method(:greet) -> Option D
Quick Check:
Use symbol argument with method [OK]
Hint: Use a symbol like :greet inside method() [OK]
Common Mistakes:
Confusing method() with send()
Using brackets instead of parentheses
Passing undefined variable instead of symbol
3. What is the output of the following Ruby code?
class Calculator
def add(x, y)
x + y
end
end
calc = Calculator.new
adder = calc.method(:add)
puts adder.call(5, 7)
medium
A. 5 7
B. 12
C. add
D. NoMethodError
Solution
Step 1: Understand method object creation
The method(:add) returns a Method object for add on calc.
Step 2: Calling the Method object
Calling adder.call(5, 7) executes add(5, 7), which returns 12.
Final Answer:
12 -> Option B
Quick Check:
Method object call returns sum 12 [OK]
Hint: Use call on Method object to run method with arguments [OK]
Common Mistakes:
Expecting method name or arguments printed
Confusing output with error
Not using call to invoke method
4. Identify the error in this Ruby code snippet:
class Person
def name
"Alice"
end
end
p = Person.new
m = p.method(name)
m.call
medium
A. Missing quotes around method name in method(name)
B. Cannot call method on an object
C. Method name does not exist
D. Using call on Method object is invalid
Solution
Step 1: Check argument to method
The argument name is used as a variable, but it should be a symbol or string representing the method name.
Step 2: Correct usage
It should be p.method(:name) or p.method('name') to get the Method object.
Final Answer:
Missing quotes around method name in method(name) -> Option A
Quick Check:
Method name must be symbol or string [OK]
Hint: Always pass method name as symbol or string to method() [OK]
Common Mistakes:
Passing bare method name without quotes or colon
Thinking method is invalid on objects
Confusing call usage
5. Given the following code, what will be the output?
class Greeter
def initialize(name)
@name = name
end
def greet
"Hello, #{@name}!"
end
end
g1 = Greeter.new("Bob")
g2 = Greeter.new("Sue")
m1 = g1.method(:greet)
m2 = g2.method(:greet)
puts m1.call
puts m2.call
hard
A. Hello, Sue!\nHello, Sue!
B. Hello, Bob!\nHello, Bob!
C. Hello, Bob!\nHello, Sue!
D. Error: undefined method greet
Solution
Step 1: Understand instance variables and method objects
Each Greeter instance stores its own @name. The method(:greet) returns a Method object bound to that instance.
Step 2: Calling Method objects
Calling m1.call runs greet on g1, printing "Hello, Bob!". Similarly, m2.call prints "Hello, Sue!".
Final Answer:
Hello, Bob!
Hello, Sue! -> Option C
Quick Check:
Method objects keep instance context [OK]
Hint: Method objects remember their object, so output matches instance data [OK]
Common Mistakes:
Assuming method objects lose instance context
Expecting same output for both calls
Confusing method object with class method
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.