2014-03-06 56 views
1

我试着去传递一个方法作为参数传递给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

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

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

然而,由于你调用特定对象上的方法,你要么必须通过在作为一个额外的参数,或者使用PROC或λ,它是像包裹在对象的块:

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 

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

0

当你:

return method_2(klass.foo, "test") 

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