2016-05-04 10 views
1

は時々私はこのように、クロージャとしてオペレータに合格する必要があります。演算子を2引数のクロージャとして参照する方法はありますか?

do.some.thing() { x,y -> x+y } 

"method pointer" syntaxに類似した任意の速記「演算子ポインタ」構文がある場合、私は思ったんだけど、それはすでに私のオペレータを与えるだろう2つの引数を持つクロージャで囲まれています。

私はほとんどの算術演算子が数および関連するクラスのメソッドとして利用可能であることがわかり

public Number plus(Number right) 

Add two numbers and return the result. 

が、それらはインスタンスメソッドであり、私はにそれらを回すためにmethod pointer operator.&を使用することができる場合、私は把握することはできません2つの引数をとるクロージャ。

答えて

3

いいえ、そのような演算子はありません。それは基本的に作成MethodClosureオブジェクト、この場合Numberクラス、及び方法を有するので

メソッドポインタ演算子は動作しません。あなたが行うのであれば...

def c = Number.&plus 

はその後cを呼び出すことはもちろん、機能しませんNumberクラス、上plus()を呼び出そうとします。

私が考えることができる唯一のショートカットは、オペレータクロージャを一度宣言し、必要に応じてそれらを再利用することです。

あなたにもこの種のものを行うことができます
5

...

わからないuncurryは、右の用語ですが、それは2引数の閉鎖を作るために、そして、ほとんど右;-)

import org.codehaus.groovy.runtime.MethodClosure 

def uncurry(MethodClosure c) { 
    {a, ...b -> a."$c.method"(*b) } 
} 

ですNumber.plusから、あなたが行うことができます:

def plus = uncurry(Number.&plus) 

そして:

をまた、他の方法で動作します

は、同様に処理します。

def collate = uncurry(List.&collate) 
assert collate([1, 2, 3, 4, 5], 2, true) == [[1, 2], [3, 4], [5]] 
+0

NB: 'uncurry'は間違いなくここに使用する権利用語ではありません...ではない、それは名前を持っていることを確認し –

関連する問題