Module_eval for dynamic behavior in Ruby - Time & Space Complexity
We want to understand how the time it takes to run code changes when using module_eval to add methods dynamically.
How does the cost grow when we add more methods this way?
Analyze the time complexity of the following code snippet.
module MyModule
def self.add_methods(n)
n.times do |i|
module_eval do
define_method("method_#{i}") { i }
end
end
end
end
MyModule.add_methods(5)
This code adds n methods dynamically to a module using module_eval.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Loop runs
ntimes, each time callingmodule_evalto define a method. - How many times: Exactly
ntimes, once per method added.
Each new method requires running module_eval once, so the total work grows as we add more methods.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 module_eval calls |
| 100 | About 100 module_eval calls |
| 1000 | About 1000 module_eval calls |
Pattern observation: The work grows directly with the number of methods added.
Time Complexity: O(n)
This means the time to add methods grows in a straight line as you add more methods.
[X] Wrong: "Using module_eval once to add many methods is always faster than calling it multiple times."
[OK] Correct: Each module_eval call runs code, so calling it many times adds up linearly. Using it once with many method definitions can be more efficient.
Understanding how dynamic code execution scales helps you write flexible Ruby code that stays efficient as it grows.
What if we changed the code to call module_eval once with all method definitions inside? How would the time complexity change?
Practice
What does module_eval do in Ruby?
Solution
Step 1: Understand the purpose of
module_evalmodule_evallets you run code inside a module's context, allowing you to add or change methods dynamically.Step 2: Compare options with the definition
Only "It allows adding or changing methods inside a module dynamically." correctly describes this dynamic behavior. Other options describe unrelated actions.
Final Answer:
It allows adding or changing methods inside a module dynamically. -> Option DQuick Check:
module_eval adds or changes methods = A [OK]
- Thinking module_eval deletes methods
- Confusing module_eval with module creation
- Assuming module_eval converts modules to classes
Which of the following is the correct syntax to define a method greet inside a module Mod using module_eval?
module Mod # Your code here end
Solution
Step 1: Recall correct module_eval syntax
You can pass a block to
module_evalwith method definitions inside curly braces.Step 2: Check each option's syntax
Mod.module_eval { def greet; 'Hi'; end } uses a block correctly. Mod.module_eval def greet; 'Hi'; end misses braces. Mod.module_eval('def greet; 'Hi'; end') has mismatched quotes (inner single quote breaks the outer single-quoted string), causing syntax error. Mod.module_eval :def greet; 'Hi'; end uses invalid symbol syntax.
Final Answer:
Mod.module_eval { def greet; 'Hi'; end } -> Option AQuick Check:
Block syntax with braces is correct = A [OK]
- Omitting braces for block
- Using invalid symbol syntax
- Confusing string and block syntax
What will be the output of the following Ruby code?
module M
module_eval do
def hello
'Hello from M'
end
end
end
class C
include M
end
puts C.new.helloSolution
Step 1: Understand method definition inside module_eval
The methodhellois defined inside moduleMusingmodule_eval, so it becomes an instance method ofM.Step 2: Check class inclusion and method call
ClassCincludesM, so instances ofChavehellomethod. CallingC.new.helloreturns 'Hello from M'.Final Answer:
Hello from M -> Option AQuick Check:
module_eval defines method, include makes it accessible = D [OK]
- Assuming method is not defined
- Confusing module_eval with class_eval
- Expecting syntax error from block
Identify the error in the following code snippet:
module M module_eval 'def greet; puts "Hi" end' end class C include M end C.new.greet
Solution
Step 1: Analyze module_eval string syntax
The string passed tomodule_evaldefines methodgreetcorrectly with a semicolon separating statements.Step 2: Check method availability and call
ClassCincludesM, sogreetis available to instances. CallingC.new.greetprints 'Hi'.Final Answer:
No error; code runs and prints 'Hi'. -> Option BQuick Check:
module_eval string defines method correctly = C [OK]
- Thinking semicolon is missing
- Assuming greet is not instance method
- Expecting runtime error from string eval
You want to dynamically add multiple methods foo and bar to a module Mod using module_eval. Which approach correctly adds both methods so they can be used by classes including Mod?
Solution
Step 1: Understand multiple method definitions with module_eval
You can define multiple methods in one block or multiple times with separate calls tomodule_eval. Both ways add instance methods to the module.Step 2: Evaluate each option
Mod.module_eval do def foo; 'foo'; end def bar; 'bar'; end end defines both as instance methods (no self.) in one block, correct. All of the above "All of the above" is incorrect. Mod.module_eval do def self.foo; 'foo'; end end Mod.module_eval do def self.bar; 'bar'; end end uses separate blocks butdef self.adds singleton methods to Mod, not instance methods. Mod.module_eval('def self.foo; "foo"; end') Mod.module_eval('def self.bar; "bar"; end') uses strings withdef self., same issue - not accessible afterinclude.Final Answer:
Mod.module_eval do def foo; 'foo'; end def bar; 'bar'; end end -> Option CQuick Check:
Block with plain def (no self) adds instance methods = A [OK]
- Thinking only one method per module_eval is allowed
- Confusing string and block syntax
- Using self.def for instance methods (makes singletons)
Ready to prove it?
Pass the test and this pattern moves unknown
