如何以编程方式创建closure
?
我的意思是不喜欢这个
def closure = { println "hello world" }
但更喜欢这个
Closure cl = new MethodClosure(this, "method")
....
然后调用闭包的不同方法来定义body等。
答案 0 :(得分:1)
好吧,你的例子实际上并不是以编程方式创建Closure,因为它基本上需要解析并将方法的源代码编译成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