Groovy闭包 - 不可理解的通话顺序

时间:2016-02-22 13:28:10

标签: groovy closures

我尝试构建一个小型DSL,但我不了解以下执行顺序。

DSL的声明为summarize tests of 'me'

我的Groovy脚本解释是:

def tests = {
    [of: { who ->
            println "IN CLOSURE"
            "HALLO" // dummy value for testing
        }]
}

def summarize(Closure c) {
    println "SUMMARIZE - CALL CLOSURE"
    def f = c()
    println "SUMMARIZE - CALL CLOSURE"
    println "RESULT $f"
    f
}

我的来电者脚本

def g = summarize tests of 'me'
println g

输出

SUMMARIZE - CALL CLOSURE
SUMMARIZE - CALL CLOSURE
RESULT [of:com.github.groovyclient.TestRailClient$_closure1$_closure13@470f1802]
IN CLOSURE
HALLO

我实际上想要在tests方法中得到summarize闭包的结果,但似乎还没有调用内部闭包 - 之后发生了什么魔法,以便脚本确实有正确的结果吗?

有人可以解释一下,为什么执行顺序?如何在HALLO方法中检索summarize

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

在您的示例中,test是一个返回地图的闭包。 如果您致电test(),您将获得[of: {...}]

当您打印f时,这是您在控制台中看到的内容。 对于groovy

summarize tests of 'me'

相当于

summarize(tests).of('me')

你的summarize(tests)执行tests(),返回地图[of:{..}]。之后,您正在执行返回结束的map.of,然后使用参数me调用此闭包。

有不同的选项可以获得你想要的东西,但它取决于你想要实现的完整“dsl”,而不仅仅是这个特殊的用例。我认为只有这句话的最简单的方法是返回一个中间对象,当你调用'of'时会触发它:

def summarize(t) {
  return [
    of: { who ->
      def f = t().of(who)
      println f
    }
  ]
}