我多次见过奇怪的代码:
...
private currencyFormat = NumberFormat.currencyInstance
def convert = currencyFormat.&parse
...
奇怪的是我的意思是这个 - >的&安培;解析即可。为什么需要逻辑AND运算符以及可以使用哪些运算符?
答案 0 :(得分:4)
这是一个方法指针
convert
现在实际上是一个Closure,它委托给解析方法
defined here没有示例,mrhaki did a post about it here。
作为显示它处理重载的示例,请考虑使用2个静态方法的类:
class Test {
static void printSomething( String thing ) {
println "A:$thing"
}
static void printSomething( String thing, String thing2 ) {
println "B:$thing$thing2"
}
}
我们可以参考printSomething
方法:
def ref = Test.&printSomething
然后我们可以将其传递给单个项目列表上的each
调用:
// prints A:a and A:b
[ 'a', 'b' ].each ref
或者我们可以传递两个项目,它会选择正确的重载方法来调用:
// prints B:ab and B:cd
[ [ 'a', 'b' ], [ 'c', 'd' ] ].each ref
答案 1 :(得分:1)
这不是一个操纵操作员。可能选择了&符,因为这就是C的地址运算符所使用的。这个想法是你可以传递对特定实例上的方法的引用。
说你有一些逻辑:
def stuff = null
if (condition) {
stuff = foo.doThis(a, b, c)
} else {
stuff = bar.doOther(a, b, c)
}
您可以使用如下方法指针重写它:
def myMethod = condition ? foo.&doThis : bar.&doOther
def stuff = myMethod(a, b, c)
答案 2 :(得分:0)
这并不意味着and
。将方法重用为闭包是一种特殊的语法。现在,您可以在可以传递闭包的位置使用convert
,例如grep
,find
或类似方法。