在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 不使用分号来表示换行符,因此此处的反斜杠字符表示下一行是当前行的延续。 这样任何人或编译器都会知道
.toLowerCase()
不是它自己的语句,因为前一行以反斜杠结尾:
.trim()\
要向现有的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
}
;
替代方法是使用括号,但当然,格式首选项是非常主观的,但我很高兴有
\
支持,使代码更具可读性以满足我的需求。