我让自己熟悉了 groovy,并对以下代码运行感到有点惊讶:
class Main {
static void main(String[] args) {
abc : 1
}
}
什么是 abc : 1
?我认为它可能是一个 map ,如下代码:
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]
。有没有我不知道的冒号的用法?
最佳答案
您的示例中有 2 种不同的使用上下文。
1。命名参数
在第一个示例中,您使用了 Groovy's named parameters .以下 Groovy 代码:
print(abc: 1)
相当于
print([abc: 1])
Groovy 使用映射来表示命名参数,并且此构造仅在方法调用中可用。这就是为什么当您尝试将 abc : 1
分配给变量时,编译因错误而失败。
2。标签语句
第二个使用闭包的例子是 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 框架使用诸如 given
、when
、then
之类的标签将特定行为添加到测试中)。
关于groovy - Groovy 的 'name : expression' 语法的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052379/