Bird
Raised Fist0
Rubyprogramming~5 mins

Define_method for dynamic methods in Ruby - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Define_method for dynamic methods
O(n)
Understanding Time Complexity

We want to understand how the time it takes to create dynamic methods changes as we add more methods.

How does the work grow when we define many methods using define_method?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

class DynamicMethods
  def initialize(names)
    names.each do |name|
      self.class.define_method(name) do
        "Hello from #{name}!"
      end
    end
  end
end

obj = DynamicMethods.new([:greet, :welcome, :hello])
    

This code creates methods dynamically for each name in the list.

Identify Repeating Operations
  • Primary operation: Looping over the list of names to define methods.
  • How many times: Once for each name in the input list.
How Execution Grows With Input

Each new method requires one step to define it, so the total work grows as we add more names.

Input Size (n)Approx. Operations
1010 method definitions
100100 method definitions
10001000 method definitions

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

Final Time Complexity

Time Complexity: O(n)

This means the time to define methods grows in a straight line with the number of methods.

Common Mistake

[X] Wrong: "Defining methods with define_method is instant no matter how many methods."

[OK] Correct: Each method takes some time to create, so more methods mean more total time.

Interview Connect

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

Self-Check

"What if we defined methods inside a nested loop? How would that affect the time complexity?"

Practice

(1/5)
1. What does define_method do in Ruby?
easy
A. Creates a method dynamically during program execution
B. Deletes an existing method from a class
C. Calls a method with given arguments
D. Defines a constant value in a class

Solution

  1. Step 1: Understand the purpose of define_method

    define_method allows creating methods while the program runs, not just when writing code.
  2. Step 2: Compare options with define_method behavior

    Only Creates a method dynamically during program execution correctly describes dynamic method creation. Other options describe unrelated actions.
  3. Final Answer:

    Creates a method dynamically during program execution -> Option A
  4. Quick Check:

    define_method = dynamic method creation [OK]
Hint: define_method creates methods while program runs [OK]
Common Mistakes:
  • Thinking define_method deletes methods
  • Confusing define_method with method calls
  • Assuming define_method defines constants
2. Which of the following is the correct syntax to define a method named greet dynamically inside a class using define_method?
easy
A. define_method('greet') { puts 'Hello' }
B. define_method :greet puts 'Hello' end
C. def define_method :greet puts 'Hello' end
D. define_method greet puts 'Hello'

Solution

  1. Step 1: Recall correct define_method syntax

    The method name can be a symbol or string, and the method body is given as a block.
  2. Step 2: Check each option for syntax correctness

    define_method('greet') { puts 'Hello' } uses parentheses and a block correctly. define_method :greet do puts 'Hello' end misses parentheses and block braces, causing syntax error. Options C and D have invalid syntax.
  3. Final Answer:

    define_method('greet') { puts 'Hello' } -> Option A
  4. Quick Check:

    define_method syntax = method name + block [OK]
Hint: Use parentheses and block for define_method syntax [OK]
Common Mistakes:
  • Omitting parentheses around method name
  • Not using a block for method body
  • Writing def inside define_method incorrectly
3. What will be the output of this Ruby code?
class Person
  [:walk, :run].each do |action|
    define_method(action) { puts "I can #{action}" }
  end
end

p = Person.new
p.walk
p.run
medium
A. I can run I can run
B. I can walk I can run
C. NoMethodError for walk
D. SyntaxError

Solution

  1. Step 1: Understand the loop and define_method usage

    The code loops over [:walk, :run] using each do |action| and defines two methods dynamically. Ruby blocks capture the loop variable action by value for each iteration, so each method captures its own action value.
  2. Step 2: Trace method calls on instance

    p.walk prints "I can walk" and p.run prints "I can run" as expected.
  3. Final Answer:

    I can walk I can run -> Option B
  4. Quick Check:

    Blocks capture loop variable per iteration [OK]
Hint: Blocks in Ruby loops capture loop variable per iteration [OK]
Common Mistakes:
  • Expecting same output for both methods (confuses closure capture)
  • Thinking methods are not defined
  • Confusing syntax with errors
4. Identify the error in this code snippet:
class Calculator
  [:add, :subtract].each do |op|
    define_method(op) do |a, b|
      if op == :add
        a + b
      else
        a - b
      end
    end
  end
end

calc = Calculator.new
puts calc.add(5, 3)
puts calc.subtract(5, 3)
medium
A. Wrong number of arguments passed to methods
B. Missing parentheses in method calls
C. The variable op inside the block always refers to the last symbol
D. Syntax error in define_method block

Solution

  1. Step 1: Understand variable capture in blocks

    The block uses op inside the method body, but op is from the outer loop and will be the last value (:subtract) when methods run.
  2. Step 2: Explain effect on method behavior

    Both methods will behave as if op == :subtract, so add will subtract incorrectly.
  3. Final Answer:

    The variable op inside the block always refers to the last symbol -> Option C
  4. Quick Check:

    Block variable capture causes wrong method behavior [OK]
Hint: Block variables may capture last loop value, causing bugs [OK]
Common Mistakes:
  • Assuming op is unique per method
  • Ignoring variable capture in closures
  • Thinking syntax is wrong
5. How can you fix the following code so that each dynamically defined method behaves correctly?
class Calculator
  [:add, :subtract].each do |op|
    define_method(op) do |a, b|
      if op == :add
        a + b
      else
        a - b
      end
    end
  end
end
hard
A. Pass op as a method argument
B. Replace define_method with def keyword
C. Remove the if-else and always return a + b
D. Use a local variable inside the loop to capture op value before define_method

Solution

  1. Step 1: Understand variable capture problem

    The variable op is shared in the loop and captured by the block, causing all methods to use the last value.
  2. Step 2: Fix by assigning op to a local variable inside the loop

    Assign current_op = op inside the loop, then use current_op inside define_method block to capture correct value.
  3. Final Answer:

    Use a local variable inside the loop to capture op value before define_method -> Option D
  4. Quick Check:

    Local variable capture fixes closure bug [OK]
Hint: Assign loop variable to local var before define_method [OK]
Common Mistakes:
  • Trying to pass op as method argument (won't fix closure)
  • Replacing define_method with def (loses dynamic behavior)
  • Ignoring the variable capture issue
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