Groovy - 行尾的反斜杠意味着什么?

问题描述 投票:0回答:2

在groovy中,行尾的反斜杠意味着什么?具体来说,kickstart grails 插件中的下一个代码的意义是什么?:

dateFormat = messageSource.getMessage("default.date.format",null,'mm/dd/yyyy',LocaleContextHolder.locale )\
            .replace('z', '').replace('Z', '')\
            .replace('h', '').replace('H', '')\
            .replace('k', '').replace('K', '')\
            .replace('w', '').replace('W', '')\
            .replace('s', '').replace('S', '')\
            .replace('m', '').replace('a', '').replace('D', '').replace('E', '').replace('F', '').replace('G', '').replace(':', '')\
            .replace('MMM', 'MM').replace('ddd', 'dd')\
            .trim()\
            .toLowerCase()
groovy
2个回答
4
投票

由于 Groovy 不使用分号来表示换行符,因此此处的反斜杠字符表示下一行是当前行的延续。 这样任何人或编译器都会知道

.toLowerCase()

不是它自己的语句,因为前一行以反斜杠结尾:

.trim()\

0
投票

要向现有的https://stackoverflow.com/a/33117885/95750添加更详细的上下文(因为它不适合注释),问题不在于 Groovy 不将分号识别为语句结尾(将其称为“行尾”是错误的),事实上,解析器会很高兴地识别它是否存在。问题是解析器不需要存在分号,这意味着它必须从上下文中找到语句的结尾,而对于为了可读性而格式化为多行的语句来说,这并不总是可能的。对于函数参数尤其如此,因为括号是可选的。这是一个简单的例子来说明我的意思:

def func(Map opts) {
    println(opts)
}

func(a: 1, b: 2)
func a: 1, b: 2
func
    a: 1,
    b: 2

有 3 次调用

func
,其中前 2 次可以正常工作,因为整个语句在一行中。但是,第三次调用将导致解析器给出类似的编译错误
Unexpected input: ','; Expecting <EOF> @ line 8, column 9.

要修复它,您需要像下面一样使用反斜杠(分号是可选的,但我喜欢用它来保持块对称性)

func \
    a: 1,
    b: 2
;

这可能会觉得很愚蠢,但一个现实的例子是 Jenkins Pipeline Groovy 中的脚本化

https://www.jenkins.io/doc/pipeline/steps/workflow-cps/#parallel-execute-in-parallel
步骤。您会注意到文档中的以下虚拟示例:

parallel firstBranch: {
    // do something
}, secondBranch: {
    // do something else
}

我喜欢像这样更好地格式化它:

parallel \
    firstBranch: {
        // do something
    },
    secondBranch: {
        // do something else
    }
;

替代方法是使用括号,但当然,格式首选项是非常主观的,但我很高兴有

\
支持,使代码更具可读性以满足我的需求。

© www.soinside.com 2019 - 2024. All rights reserved.