Groovy'的不同行为;s';名称:表达式';语法

Groovy'的不同行为;s';名称:表达式';语法,groovy,Groovy,我熟悉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 {

我熟悉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]
。是否有我不知道的冒号用法?

在您的示例中有两种不同的用法上下文

1.命名参数 在第一个示例中,您使用了。下面是Groovy代码:

print(abc: 1)
相当于

print([abc: 1])
Groovy使用一个映射来表示命名参数,这种构造只在方法调用中可用。这就是为什么当您尝试将
abc:1
赋值给变量时,编译失败并出现错误

2.标记语句 第二个使用闭包的示例是。如果您格式化代码,它将如下所示:

def closure={->
abc:
return 1//return在本例中当然是可选的。我添加它是为了使示例更加明确
}
print closure()//打印1

请记住,标签对代码的语义没有影响,这就是为什么您会得到
1
。标签出现在抽象语法树中,可用于操作代码(例如,Spock Framework使用标签,如
给定的
时,
然后
将特定行为添加到测试中)。

您还可以使用标签对嵌套循环进行快捷操作,ie:@tim_yates:一个标签是只标记一条语句还是整个块?我假设outerloop还将语句标记为“System.out.println(“Done”);”。我可以只对循环和switch语句进行转义,或者也可以对带标签的代码块进行转义。在后一种情况下,我希望“完成”不会被打印出来。我相信是前者。通常避免以这种方式使用标签,因为这样会使代码难以理解。我不记得在过去5年里写过一篇@Szymon Stepniak:我试着总结一下:\n@SamuelGraf关于你的总结问题,你做对了。示例中的第一个和第四个类使用带标签的语句,正如您所提到的,它确实改变了结果。第二个类使用命名参数(相当于希望有一个HashMap作为参数的方法),而第三个类无法编译,因为此上下文中的表示法(为变量赋值)无效-在这种情况下,必须使用方括号定义映射。