groovy - Groovy 的 'name : expression' 语法的不同行为

标签 groovy

我让自己熟悉了 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 框架使用诸如 givenwhenthen 之类的标签将特定行为添加到测试中)。

关于groovy - Groovy 的 'name : expression' 语法的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052379/

相关文章:

grails - 用大量变量更新域类对象的最佳方法是什么

jenkins - jenkins中执行groovy脚本和执行系统groovy脚本的区别?

java - Grails 属于,我应该吗?

java - 文件存在,无法读取以标准方式给出的路径,相同的字符串不匹配 - Groovy

regex - 用于正则表达式匹配的 Groovy 语法

groovy - 原因:无此类属性:类org.gradle.api.plugins.Convention的sourceSets

grails - Grails:用户输入了格式化的字符串,但未保留格式

groovy - 仅当结果不为空时才收集

java - groovy 属性类的 JAXB 注释

grails - 从grails过滤器DSL内部访问常量