我使自己熟悉groovy,并且对以下代码运行感到有些惊讶:
class Main {
static void main(String[] args) {
abc : 1
}
}
什么是abc : 1
?我认为这可能是一张地图,如下所示:
class Main {
static void main(String[] args) {
print(abc : 1)
}
}
导致[abc:1]
被打印到控制台,但是
class Main {
static void main(String[] args) {
def map = abc : 1
}
}
不编译!!!但是最令人困惑的部分是将表达式包装到闭包中
class Main {
static void main(String[] args) {
def closure = {-> abc : 1}
print closure()
}
}
导致1
被打印到控制台而不是[abc:1]
。我不了解结肠吗?
答案 0 :(得分:5)
您的示例中有2种不同的用法上下文。
在第一个示例中,您使用了Groovy's named parameters。以下Groovy代码:
print(abc: 1)
等同于
print([abc: 1])
Groovy使用映射表示命名的参数,并且此构造仅在方法调用中可用。这就是为什么当您尝试将abc : 1
分配给变量时,编译失败并显示错误的原因。
使用闭包的第二个示例是labeled statement的示例。如果格式化代码,则它看起来像这样:
def closure = { ->
abc:
return 1 // return is optional of course in this case. I added it to make the example more explicit
}
print closure() // prints 1
请记住,标签对代码的语义没有影响,这就是为什么您获得1
的原因。标签存在于抽象语法树中,它们可用于操纵代码(例如Spock Framework使用诸如given
,when
,then
之类的标签向测试添加特定行为)。