Bird
Raised Fist0
Rubyprogramming~5 mins

Module_eval for dynamic behavior in Ruby - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Module_eval for dynamic behavior
O(n)
Understanding Time 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?

Scenario Under Consideration

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 Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Loop runs n times, each time calling module_eval to define a method.
  • How many times: Exactly n times, once per method added.
How Execution Grows With Input

Each new method requires running module_eval once, so the total work grows as we add more methods.

Input Size (n)Approx. Operations
10About 10 module_eval calls
100About 100 module_eval calls
1000About 1000 module_eval calls

Pattern observation: The work grows directly with the number of methods added.

Final Time Complexity

Time Complexity: O(n)

This means the time to add methods grows in a straight line as you add more methods.

Common Mistake

[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.

Interview Connect

Understanding how dynamic code execution scales helps you write flexible Ruby code that stays efficient as it grows.

Self-Check

What if we changed the code to call module_eval once with all method definitions inside? How would the time complexity change?

Practice

(1/5)
1.

What does module_eval do in Ruby?

easy
A. It converts a module into a class.
B. It deletes all methods from a module.
C. It creates a new module with fixed methods.
D. It allows adding or changing methods inside a module dynamically.

Solution

  1. Step 1: Understand the purpose of module_eval

    module_eval lets you run code inside a module's context, allowing you to add or change methods dynamically.

  2. 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.

  3. Final Answer:

    It allows adding or changing methods inside a module dynamically. -> Option D
  4. Quick Check:

    module_eval adds or changes methods = A [OK]
Hint: Remember: module_eval changes module methods at runtime [OK]
Common Mistakes:
  • Thinking module_eval deletes methods
  • Confusing module_eval with module creation
  • Assuming module_eval converts modules to classes
2.

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
easy
A. Mod.module_eval { def greet; 'Hi'; end }
B. Mod.module_eval def greet; 'Hi'; end
C. Mod.module_eval('def greet; 'Hi'; end')
D. Mod.module_eval :def greet; 'Hi'; end

Solution

  1. Step 1: Recall correct module_eval syntax

    You can pass a block to module_eval with method definitions inside curly braces.

  2. 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.

  3. Final Answer:

    Mod.module_eval { def greet; 'Hi'; end } -> Option A
  4. Quick Check:

    Block syntax with braces is correct = A [OK]
Hint: Use braces {} to pass a block to module_eval [OK]
Common Mistakes:
  • Omitting braces for block
  • Using invalid symbol syntax
  • Confusing string and block syntax
3.

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.hello
medium
A. Hello from M
B. NoMethodError
C. SyntaxError
D. nil

Solution

  1. Step 1: Understand method definition inside module_eval

    The method hello is defined inside module M using module_eval, so it becomes an instance method of M.
  2. Step 2: Check class inclusion and method call

    Class C includes M, so instances of C have hello method. Calling C.new.hello returns 'Hello from M'.
  3. Final Answer:

    Hello from M -> Option A
  4. Quick Check:

    module_eval defines method, include makes it accessible = D [OK]
Hint: module_eval defines methods accessible after include [OK]
Common Mistakes:
  • Assuming method is not defined
  • Confusing module_eval with class_eval
  • Expecting syntax error from block
4.

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
medium
A. The method greet is defined but calling it prints nothing.
B. No error; code runs and prints 'Hi'.
C. Syntax error due to missing semicolon in module_eval string.
D. NoMethodError because greet is not defined as an instance method.

Solution

  1. Step 1: Analyze module_eval string syntax

    The string passed to module_eval defines method greet correctly with a semicolon separating statements.
  2. Step 2: Check method availability and call

    Class C includes M, so greet is available to instances. Calling C.new.greet prints 'Hi'.
  3. Final Answer:

    No error; code runs and prints 'Hi'. -> Option B
  4. Quick Check:

    module_eval string defines method correctly = C [OK]
Hint: Check string syntax carefully; semicolon separates statements [OK]
Common Mistakes:
  • Thinking semicolon is missing
  • Assuming greet is not instance method
  • Expecting runtime error from string eval
5.

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?

hard
A. Mod.module_eval do def self.foo; 'foo'; end end Mod.module_eval do def self.bar; 'bar'; end end
B. All of the above
C. Mod.module_eval do def foo; 'foo'; end def bar; 'bar'; end end
D. Mod.module_eval('def self.foo; "foo"; end') Mod.module_eval('def self.bar; "bar"; end')

Solution

  1. Step 1: Understand multiple method definitions with module_eval

    You can define multiple methods in one block or multiple times with separate calls to module_eval. Both ways add instance methods to the module.
  2. 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 but def 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 with def self., same issue - not accessible after include.
  3. Final Answer:

    Mod.module_eval do def foo; 'foo'; end def bar; 'bar'; end end -> Option C
  4. Quick Check:

    Block with plain def (no self) adds instance methods = A [OK]
Hint: module_eval block with plain def defines instance methods [OK]
Common Mistakes:
  • Thinking only one method per module_eval is allowed
  • Confusing string and block syntax
  • Using self.def for instance methods (makes singletons)
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard