【问题标题】:How to allow multiple parameters to be passed into define_singleton_method如何允许将多个参数传递给define_singleton_method
【发布时间】:2012-08-25 01:49:33
【问题描述】:

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

例如:

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

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

def learn_maneuvering(name, &block)
    define_singleton_method(name, &block) 
end

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

然后我开始:

def learn_maneuvering(name, &block)
    define_singleton_method(name) do |*args|
        # to do
    end
end

我相信这将循环直到使用所有参数对吗?任何人,我不确定如何将这些参数传递给给定的块。

【问题讨论】:

    标签: ruby metaprogramming block


    【解决方案1】:

    你已经接近了:

    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
    

    打印:

    转50度
    转60度

    但这真的是你想要的吗?好像只是在做

    r.turn 50
    r.turn 60
    

    对我来说更有意义。

    【讨论】:

    • 酷!是的,这就是我想要的,非常感谢!我将如何在 Ruby 1.9.3 API 上查找它以查看方法块具有哪些方法以及方法具有哪些参数?我知道这个网站,但我的意思是我只是寻找关键字块吗?
    • 一个块只是一个带有某些特殊处理的Proc。此外,block 不是关键字,您可以轻松完成&fooblock
    猜你喜欢
    • 2015-09-05
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多