有时我需要传递一个运算符作为闭包,如下所示:
do.some.thing() { x,y -> x+y }
我想知道是否有任何速记"操作指针"类似于"method pointer" syntax的语法,它会让运算符已经包含在一个双参数闭包中。
我看到大多数算术运算符都可用作Number和相关类的方法:
public Number plus(Number right)
Add two numbers and return the result.
但它们是实例方法,我无法弄清楚是否可以使用method pointer operator .&
将它们转换为双参数闭包。
答案 0 :(得分:5)
你也可以这样做......
不确定uncurry
是正确的术语,但它几乎是正确的; - )
import org.codehaus.groovy.runtime.MethodClosure
def uncurry(MethodClosure c) {
{a, ...b -> a."$c.method"(*b) }
}
然后,要从Number.plus
进行2 arg闭包,你可以这样做:
def plus = uncurry(Number.&plus)
然后:
assert plus(1, 2) == 3
这也适用于其他方法句柄:
def collate = uncurry(List.&collate)
assert collate([1, 2, 3, 4, 5], 2, true) == [[1, 2], [3, 4], [5]]
答案 1 :(得分:3)
不,没有这样的操作员。
方法指针操作符不起作用,因为它创建的MethodClosure
基本上有一个对象,在本例中是Number
类,以及方法 name 。所以,如果你这样做......
def c = Number.&plus
然后拨打c
会尝试拨打plus()
课程上的Number
,这当然无法正常工作。
我能想到的唯一捷径就是声明操作员关闭一次,然后根据需要重复使用它们。