Groovy的“ name:expression”语法的不同行为

时间:2019-01-05 13:16:28

标签: 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 {

    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 个答案:

答案 0 :(得分:5)

您的示例中有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 Framework使用诸如givenwhenthen之类的标签向测试添加特定行为)。