Bird
Raised Fist0
Rubyprogramming~5 mins

Define_method for dynamic methods in Ruby

Choose your learning style10 modes available
Introduction

Define_method lets you create methods on the fly. This helps when you want many similar methods without writing each one by hand.

When you want to create many similar methods that differ only by name or small behavior.
When method names depend on user input or data you get while the program runs.
When you want to keep your code shorter and easier to change later.
When you want to add methods to a class dynamically based on conditions.
When you want to avoid repeating similar code for each method.
Syntax
Ruby
define_method(:method_name) do |parameters|
  # method body
end

The method name is given as a symbol (like :method_name).

The block after define_method is the code that runs when the method is called.

Examples
This creates a method named hello that prints "Hello!".
Ruby
class Greeter
  define_method(:hello) do
    puts "Hello!"
  end
end
This creates a method add that takes two numbers and returns their sum.
Ruby
class Calculator
  define_method(:add) do |a, b|
    a + b
  end
end
This creates three methods: walk, run, and jump, each printing a message.
Ruby
class Person
  [:walk, :run, :jump].each do |action|
    define_method(action) do
      puts "I can #{action}!"
    end
  end
end
Sample Program

This program creates an Animal class. It adds three methods dynamically: speak, eat, and sleep. Each method prints what the animal can do.

Ruby
class Animal
  def initialize(name)
    @name = name
  end

  [:speak, :eat, :sleep].each do |action|
    define_method(action) do
      puts "#{@name} can #{action}."
    end
  end
end

cat = Animal.new("Cat")
cat.speak
cat.eat
cat.sleep
OutputSuccess
Important Notes

Methods created with define_method can access instance variables like @name.

You can pass parameters to these methods just like normal methods.

Using define_method helps keep your code DRY (Don't Repeat Yourself).

Summary

define_method creates methods during program run, not just when writing code.

It is useful for making many similar methods without repeating code.

Dynamic methods can use parameters and instance variables normally.

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