鉴于此代码:
a = {1=>2}
m = a.method(:[])
我知道我现在可以使用:
value = m.call(1)
它将返回 2。问题是,我需要更改什么才能直接调用该方法,如下所示:
m.call()
它会得到 1 作为参数发送吗?如果能够写出这样的东西那就太好了:
m = a.method(:[],1) # where the symbol is the method, and 1 will be the parameter it will be called with
问题是,我想延迟执行脚本的某些部分,直到创建一些对象,并且我想避免重写所有内容以使用 lambda。
最佳答案
基本上,您想要的是一种柯里化(Currying)函数的方法。
http://en.wikipedia.org/wiki/Curry_function
这可以通过多种不同的方式来完成,其中之一:
def curry(method, *params)
lambda { send method, *params }
end
您可以将其添加到 Hash 的元类中,或者添加到您想要包含在某些对象中的模块等中。然后,调用它就成为您想要的用例:
irb(main):001:0> a = {1 => 2}
=> {1=>2}
... # add curry to Hash's metaclass
irb(main):011:0> m = a.curry :[], 1
=> #<Proc:0xb76e2154@(irb):8>
irb(main):012:0> m.call
=> 2
关于ruby - 在 Ruby 中,如何获取对包含用于调用的参数的方法的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1708265/