【问题标题】:groovy create closure programmaticallygroovy 以编程方式创建闭包
【发布时间】:2016-02-13 15:47:53
【问题描述】:

如何以编程方式创建closure

我的意思是不喜欢这样

def closure = { println "hello world" }

但更像这样

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

然后调用闭包的不同方法来定义body等

【问题讨论】:

  • 为什么?就是想。可能有更好的解决方案
  • @tim_yates 纯学术。因为应该可以做到。

标签: groovy closures


【解决方案1】:

嗯,您的示例实际上并不是以编程方式创建闭包,因为它基本上需要将方法的 源代码 解析和编译成闭包。 解析是问题所在。以编程方式创建闭包看起来类似于 Groovy AST 转换的实现;您将操纵代表低级语言结构的对象。在伪代码中......像 IfStatement、ClosureLiteral、MethodCall 等。然后你将它编译成对象;本质上绕过源代码解析。这有点像包含查询的字符串和像 Grail 的 GORM 这样的查询构建器之间的区别。

但是,Groovy 确实提供了一种简单的方法来使用 Eval 类来执行您在示例中寻找的内容。这是一个例子:

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

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

【讨论】:

  • 包含所有关于将用户输入评估为代码的常见警告标签
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2011-04-14
  • 2013-03-28
相关资源
最近更新 更多