ruby pass方法作为参数

时间:2014-03-06 16:20:14

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

我试图将方法作为参数传递给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)

2 个答案:

答案 0 :(得分: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

所有这些都是相当人为的例子;你试图解决一个具体的问题吗?

答案 1 :(得分:0)

当你:

return method_2( klass.foo, "test" )

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