2016-02-13 41 views
1

如何以編程方式創建closuregroovy以編程方式創建閉包

我的意思是不喜歡這個

def closure = { println "hello world" } 

但更喜歡這個

Closure cl = new MethodClosure(this, "method") 
.... 

,然後調用關閉不同的方法來定義體等

+0

爲什麼?就是想。可能有更好的解決方案 –

+0

@tim_yates純粹的學術。因爲它應該可以做到。 – lapots

回答

1

那麼,你的例子是實際上並不是通過編程創建一個Closure,因爲它基本上需要解析並編譯該方法的源代碼爲關閉。 解析成爲問題。以編程方式創建Closure看起來類似於Groovy AST轉換的實現;你會操縱代表低級語言結構的對象。在僞代碼中...像IfStatement,ClosureLiteral,MethodCall等等。然後你可以將它編譯成對象;基本上繞過源碼解析。這有點像包含查詢的String和像Grail的GORM這樣的查詢生成器之間的區別。

但是,Groovy確實提供了一種簡單的方法,在您的示例中使用Eval類來完成您正在尋找的任務。這裏有一個例子:

Closure closure = Eval.me("{ a, b -> a * b }") 

assert closure instanceof Closure 
assert closure(2, 3) == 6 
+1

使用所有關於評估用戶輸入代碼的常見警告標籤 –