2016-02-13 43 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

使用所有关于评估用户输入代码的常见警告标签 –