Method objects with method() in Ruby - Time & Space Complexity
We want to understand how the time needed to run code changes when we use method objects created by method() in Ruby.
Specifically, we ask: how does calling a method object repeatedly affect the total work done?
Analyze the time complexity of the following code snippet.
class Greeter
def greet(name)
"Hello, #{name}!"
end
end
g = Greeter.new
m = g.method(:greet)
names = ["Alice", "Bob", "Carol", "Dave"]
names.each do |n|
puts m.call(n)
end
This code creates a method object from an instance method and calls it for each name in a list.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Calling the method object
m.call(n)inside the loop. - How many times: Once for each element in the
namesarray.
Each time we add more names, the number of method calls grows the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 method calls |
| 100 | 100 method calls |
| 1000 | 1000 method calls |
Pattern observation: The total work grows directly with the number of names.
Time Complexity: O(n)
This means the time to run the code grows in a straight line as the list of names gets bigger.
[X] Wrong: "Using a method object makes calling the method slower and more complex."
[OK] Correct: Creating a method object is a one-time setup, and calling it inside a loop is just like calling a normal method each time, so the overall time grows linearly with input size.
Understanding how method objects behave helps you explain how Ruby handles method calls and objects, showing you know both language features and performance basics.
What if we replaced the array iteration with recursion calling the method object? How would the time complexity change?
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
