如何允许将多个参数传递给define_singleton_method

Mar*_*ark 3 ruby metaprogramming block

我想创建一个可以动态添加方法并允许多个参数的类.

例如:

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
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是这样的:

def learn_maneuvering(name, &block)
    define_singleton_method(name, &block) 
end
Run Code Online (Sandbox Code Playgroud)

但是,它只占一个参数..

然后我开始:

def learn_maneuvering(name, &block)
    define_singleton_method(name) do |*args|
        # to do
    end
end
Run Code Online (Sandbox Code Playgroud)

我相信这会循环直到所有参数都被正确使用?Anywho,我不知道如何将这些参数传递给给定的块.

And*_*all 6

你很亲密:

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
Run Code Online (Sandbox Code Playgroud)

打印:

转动50度
转动60度

但这真的是你想要的吗?这似乎只是在做

r.turn 50
r.turn 60
Run Code Online (Sandbox Code Playgroud)

对我来说更有意义.