2

我多次看到奇怪的代码:

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

奇怪我的意思是这个 -> .&parse。为什么需要逻辑 AND 运算符,还有谁可以使用它?

4

3 回答 3

4

这是一个方法指针

convert现在实际上是一个委托给 parse 方法的闭包

例子

在这里定义,没有示例,mrhaki 在这里做了一篇关于它的帖子

作为一个显示它处理重载的示例,考虑一个具有 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 
于 2013-06-23T13:45:03.877 回答
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)
于 2013-06-23T15:47:41.003 回答
0

这并不意味着and。将方法重用为闭包是一种特殊的语法。现在您可以convert在可以传递闭包的地方使用,例如grepfind类似方法。

于 2013-06-23T13:45:16.807 回答