Groovy:冒号关闭吗?

时间:2020-01-22 12:37:58

标签: groovy

我正在尝试制作自己的Dsl,并且在使用Groovy中不同样式的闭包。 我偶然发现了以下片段:

myClosure {
  testProperty: "hello!"
}

但是无法弄清楚这是否是一个有效的代码,以及如何才能访问此testProperty。有效吗如何读取"hello!"的值?

2 个答案:

答案 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的说明使用。

相关问题