【问题标题】:ruby pass method as a parameterruby 传递方法作为参数
【发布时间】:2014-04-09 10:03:21
【问题描述】:

我试图将一个方法作为参数传递给method_2,执行这个并返回结果:

def method_2( method_p, param )
  res = method(method_p).call(param)
  return res
end

def method_1
  klass = MyKlass.instance
  return method_2( klass.foo, "test" )
end

这是 MyKlass 文件:

class MyKlass
  def foo(param)
    param+param
  end
end

我得到的只是一个错误

wrong number of arguments (0 for 1)

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 methods parameters


    【解决方案1】:

    当你:

    return method_2( klass.foo, "test" )
    

    klass.foo 需要一个 arg,这可能是导致您的错误的原因。

    【讨论】:

      【解决方案2】:

      您可以使用符号来引用方法:

      def method_2(method_symbol, *args)
        send method_symbol, *args
      end
      

      但是,由于您在特定对象上调用该方法,因此您要么必须将其作为附加参数传递,要么使用 proc 或 lambda,这就像包装在对象中的块:

      def method_2(proc, *args)
        proc.call(*args)
      end
      
      method_2(->(param){ klass.foo(param) }, "test")
      

      更常见的是只使用块来执行此操作:

      def method_2(receiver, *args, &block)
        yield receiver, *args
      end
      
      method_2(klass, "test") do |receiver, param|
        receiver.foo(param)
      end
      

      所有这些都是相当人为的例子;你有什么具体的问题要解决吗?

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 2016-11-02
        • 1970-01-01
        • 2013-08-10
        • 2015-05-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 2010-11-16
        相关资源
        最近更新 更多