Groovy不寻常的约定

时间:2013-06-23 13:32:33

标签: groovy

我多次见过奇怪的代码:

...
private currencyFormat = NumberFormat.currencyInstance
def convert = currencyFormat.&parse
...

奇怪的是我的意思是这个 - >的&安培;解析即可。为什么需要逻辑AND运算符以及可以使用哪些运算符?

3 个答案:

答案 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,例如grepfind或类似方法。