我尝试构建一个小型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
?
感谢您的帮助
答案 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
}
]
}