How to allow multiple parameters to be passed into define_singleton_method

block, metaprogramming, ruby

Solution

You're close:

def learn_maneuvering(name, &block)
  define_singleton_method(name) do |*args|
    args.each do |arg|
      block.call(arg)
    end
  end
end

r = Robot.new
r.learn_maneuvering('turn') { |degree| puts "turning #{degree} degrees" }

r.turn 50, 60

prints:

turning 50 degrees turning 60 degrees

But is this really what you want? It seems like just doing

r.turn 50
r.turn 60

makes more sense to me.

Problem

I want to create a class that can add methods dynamically and allow multiple parameters. For example: ``` r = Robot.new r.learn_maneuvering('turn') { |degree| puts "turning #{degree} degrees" } r.turn 50 # => turning 50 degrees r.turn 50, 60 # => turning 50 degrees # => turning 60 degrees ``` My first attempt was this: ``` def learn_maneuvering(name, &block) define_singleton_method(name, &block) end ``` However, it only accounts for one parameter.. I then started with: ``` def learn_maneuvering(name, &block) define_singleton_method(name) do |*args| # to do end end ``` I believe this will loop until all arguments are used right? Anywho, I am not sure how to pass these arguments to the given block.

Original source