我刚开始使用Groovy,来自Haskell,C ++和一些Java的背景。
让我说我写一个如下的闭包:
def mult = { x, y -> x * y }
稍后我可以写mult(3,5)
。
但如果我写mult(3)
,我会收到编译错误。
我当然可以写mult.curry(3)
,但这对我来说似乎有点难看。
那么我可以尝试这种方法:
def mult = { x -> { y -> x * y }}
现在,mult(3)
工作正常,但要将两个数字相乘,我必须写mult(3)(5)
来乘以两个数字。
我想要的是两个世界中最好的。我希望能够撰写mult(3)
,mult(3,5)
和mult(3)(5)
。无论如何要让闭包表现得像这样?
答案 0 :(得分:5)
你可以做这样的事情来“化”你的闭包:
def currify(fn) {
{ Object... args ->
if (args.size() == fn.maximumNumberOfParameters) {
fn(*args)
} else {
currify(fn.curry(*args))
}
}
}
def mult = currify { x, y -> x * y }
def twice = mult(2)
assert mult(2, 5) == 10
assert twice(5) == 10
assert mult(2)(5) == 10