我正在尝试制作自己的Dsl,并且在使用Groovy中不同样式的闭包。 我偶然发现了以下片段:
myClosure {
testProperty: "hello!"
}
但是无法弄清楚这是否是一个有效的代码,以及如何才能访问此testProperty
。有效吗如何读取"hello!"
的值?
答案 0 :(得分:3)
现在,让我们关闭闭包,考虑以下代码:
def f1() {
testProperty : 5
}
def f2() {
testProperty : "Hello"
}
println f1()
println f1().getClass()
println f2()
println f2().getClass()
这将编译(因此语法有效)并打印:
5
class java.lang.Integer
Hello
class java.lang.String
因此,您在这里看到的是仅带有标签的语句(groovy支持标签see here)
f1(就像f2一样)的底线是:
def f1() {
return 5 // and return is optional, so we don't have to write it
}
从这个角度来看,使用闭包是完全一样的:
def method(Closure c) {
def result = c.call()
println result
println result.getClass()
}
method {
test : "hello"
}
此打印
hello
class java.lang.String
符合预期
答案 1 :(得分:1)
通常在DSL中您有以下两种情况:
mySomething {
a = 42
b = 84
}
对应于属性设置
或者这个:
mySomething( a:42, b:84 ){
somethingElse{}
}
这是Map-literal的方法调用。
您显示的代码未按照@ mark-bramnik的说明使用。