Bird
Raised Fist0
Rubyprogramming~5 mins

Define_method for dynamic methods in Ruby - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does define_method do in Ruby?
<p><code>define_method</code> creates a new method dynamically at runtime. It lets you define a method with a given name and block of code inside a class or module.</p>
Click to reveal answer
beginner
How do you use define_method to create a method named greet that prints 'Hello'?
define_method(:greet) do
  puts 'Hello'
end
Click to reveal answer
intermediate
Why use define_method instead of regular method definitions?

It helps when you want to create many similar methods dynamically, or when method names depend on data available only at runtime.

Click to reveal answer
intermediate
Can define_method access variables from the surrounding scope?

Yes, the block passed to define_method can use variables from the surrounding scope because it is a closure.

Click to reveal answer
intermediate
What is a simple example of using define_method to create multiple methods in a loop?
[:one, :two, :three].each do |name|
  define_method(name) do
    puts "Method #{name} called"
  end
end
Click to reveal answer
What argument does define_method take first?
AThe class name
BThe method body as a string
CThe method visibility
DThe method name as a symbol or string
Which of these is true about methods created with define_method?
AThey can only be private methods
BThey can access variables from the surrounding scope
CThey cannot take arguments
DThey must be defined outside classes
Why might you use define_method inside a loop?
ATo change method visibility
BTo delete existing methods
CTo create multiple methods with similar behavior but different names
DTo call methods automatically
What happens if you call define_method with a method name that already exists?
AIt overwrites the existing method
BIt raises an error
CIt ignores the new definition
DIt creates a method with a different name
Which Ruby feature allows define_method blocks to remember variables from outside?
AClosures
BInheritance
CModules
DSingleton methods
Explain how define_method can be used to create methods dynamically in Ruby.
Think about how you can create methods when you don't know their names before running the program.
You got /4 concepts.
    Describe a scenario where using define_method is better than writing methods normally.
    Imagine you want to create methods based on a list of names or actions.
    You got /4 concepts.

      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