2016-05-04 178 views
1

有時候,我需要通過運營商的倒閉,像這樣:有沒有辦法將操作符稱爲雙參數閉包?

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

我不知道是否有任何速記「經營指針」語法,類似於"method pointer" syntax,那會給我的操作已經包裹成雙參數閉包。

我看到大部分算術運算符可以作爲對數的方法及相關類:

public Number plus(Number right) 

Add two numbers and return the result. 

但他們是實例方法,我想不通,如果我可以使用method pointer operator.&將它們變成雙參數閉包。

回答

3

不,沒有這樣的操作員。

的方法指針操作將無法工作,因爲它創建基本MethodClosure有一個對象,在這種情況下,Number類和方法。所以,如果你這樣做......

def c = Number.&plus 

然後調用c將嘗試呼叫plus()上的Number類,這當然是行不通的。

我能想到的唯一捷徑是聲明一次操作符閉包,並根據需要簡單地重用它們。

5

你可以做這樣的還有事......

不知道uncurry是正確的術語,但它幾乎是正確;-)

import org.codehaus.groovy.runtime.MethodClosure 

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

然後,做一個2封閉ARG從Number.plus,你可以這樣做:

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]] 
+0

NB:'uncurry'是絕對不能在這裏使用正確的術語...不知道它有一個名字 –

相關問題