Method objects let you save a method as a value. This helps you call the method later or pass it around like a regular object.
Method objects with method() in Ruby
method_object = object.method(:method_name)
The method call returns a Method object representing the method.
You use a symbol (like :method_name) to specify the method name.
upcase method of the string "hello" into m. Calling m.call runs upcase and prints HELLO.str = "hello" m = str.method(:upcase) puts m.call
greet as a Method object and calls it with "Alice".def greet(name) "Hi, #{name}!" end m = method(:greet) puts m.call("Alice")
sum method of the array and calls it to print the total 6.arr = [1, 2, 3] method_obj = arr.method(:sum) puts method_obj.call
This program creates a Calculator object, saves its add method as a Method object, then calls it with two numbers and prints the sum.
class Calculator def add(a, b) a + b end end calc = Calculator.new add_method = calc.method(:add) result = add_method.call(5, 7) puts "The sum is: #{result}"
You can call the method object with call and pass any needed arguments.
Method objects keep the original method's context, so they remember which object they belong to.
Using method objects can make your code more flexible and easier to reuse.
Method objects let you treat methods like values you can save and pass around.
Use object.method(:name) to get a Method object.
Call the method later with call and arguments.
Practice
obj.method(:foo) return?Solution
Step 1: Understand
Themethodusagemethodmethod on an object returns a Method object representing the named method.Step 2: Identify the return type
Callingobj.method(:foo)returns a Method object, not the method's result or a symbol.Final Answer:
A Method object representing the methodfooofobj-> Option AQuick Check:
obj.method(:foo)returns Method object [OK]
method returns a Method object, not the call result [OK]- Thinking it calls the method immediately
- Confusing with symbol
:foo - Assuming it returns a string or error
greet on object person?Solution
Step 1: Check argument type for
Themethodmethodmethod 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 variablegreet, causing error. person.method[b greet] uses brackets, which is invalid syntax.Final Answer:
person.method(:greet) -> Option DQuick Check:
Use symbol argument withmethod[OK]
:greet inside method() [OK]- Confusing
method()withsend() - Using brackets instead of parentheses
- Passing undefined variable instead of symbol
class Calculator
def add(x, y)
x + y
end
end
calc = Calculator.new
adder = calc.method(:add)
puts adder.call(5, 7)Solution
Step 1: Understand method object creation
Themethod(:add)returns a Method object foraddoncalc.Step 2: Calling the Method object
Callingadder.call(5, 7)executesadd(5, 7), which returns 12.Final Answer:
12 -> Option BQuick Check:
Method object call returns sum 12 [OK]
call on Method object to run method with arguments [OK]- Expecting method name or arguments printed
- Confusing output with error
- Not using
callto invoke method
class Person
def name
"Alice"
end
end
p = Person.new
m = p.method(name)
m.callSolution
Step 1: Check argument to
The argumentmethodnameis used as a variable, but it should be a symbol or string representing the method name.Step 2: Correct usage
It should bep.method(:name)orp.method('name')to get the Method object.Final Answer:
Missing quotes around method name inmethod(name)-> Option AQuick Check:
Method name must be symbol or string [OK]
method() [OK]- Passing bare method name without quotes or colon
- Thinking
methodis invalid on objects - Confusing
callusage
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.callSolution
Step 1: Understand instance variables and method objects
Each Greeter instance stores its own @name. Themethod(:greet)returns a Method object bound to that instance.Step 2: Calling Method objects
Callingm1.callrunsgreetong1, printing "Hello, Bob!". Similarly,m2.callprints "Hello, Sue!".Final Answer:
Hello, Bob! Hello, Sue! -> Option CQuick Check:
Method objects keep instance context [OK]
- Assuming method objects lose instance context
- Expecting same output for both calls
- Confusing method object with class method
Ready to prove it?
Pass the test and this pattern moves unknown
