Groovy 多行字符串有啥问题?
Posted
技术标签:
【中文标题】Groovy 多行字符串有啥问题?【英文标题】:What's wrong with Groovy multi-line String?Groovy 多行字符串有什么问题? 【发布时间】:2011-07-02 01:49:33 【问题描述】:Groovy 脚本引发错误:
def a = "test"
+ "test"
+ "test"
错误:
No signature of method: java.lang.String.positive() is
applicable for argument types: () values: []
虽然此脚本运行良好:
def a = new String(
"test"
+ "test"
+ "test"
)
为什么?
【问题讨论】:
如果它对其他人有帮助,您可以使用类似def a = b + + "/" + c
的代码得到同样的错误。在这种情况下,两个 + 符号显然是问题所在。
【参考方案1】:
由于 groovy 没有 EOL 标记(例如 ;
),如果您将运算符放在以下行会混淆
这会起作用:
def a = "test" +
"test" +
"test"
正如 Groovy 解析器所知道的那样,下面一行会出现一些内容
Groovy 将您原来的 def
视为三个单独的语句。第一个将test
分配给a
,后两个尝试使"test"
为正(这就是失败的地方)
使用new String
构造方法,Groovy 解析器仍然在构造函数中(因为大括号还没有关闭),所以它可以将三行逻辑连接到一个语句中
对于真正的多行字符串,也可以使用三引号:
def a = """test
test
test"""
将创建一个包含三行测试的字符串
另外,您可以通过以下方式使其更整洁:
def a = """test
|test
|test""".stripMargin()
stripMargin
method 将修剪每一行的左侧(直到并包括 |
字符)
【讨论】:
或者干脆用stripIndent()代替stripMargin()
。
是的,在多余的行中省略 |
字符
你可以在"""
字符串中使用双引号
对,我已经编辑了答案,以说明您需要如何稍微重新格式化代码以使 stripIndent()
工作。
因为a)我已经将它作为评论发布,并且b)它与这个答案没有太大不同。【参考方案2】:
您可以通过添加一对括号 ( ... )
来告诉 Groovy 语句应该计算超出行尾的值
def a = ("test"
+ "test"
+ "test")
第二种选择是在每行的末尾使用反斜杠\
:
def a = "test" \
+ "test" \
+ "test"
FWIW,这与 Python 多行语句的工作方式相同。
【讨论】:
第二个也是 VBA 多行语句的工作方式:D(仅使用下划线而不是反斜杠,因为 VBA。) 第二个选项在 Jenkinsfile 中对我来说失败了。第一个选项有效。 Nitpick:Python多行字符串在使用parens时不需要连接运算符,所以并不完全相同。【参考方案3】:类似于stripMargin()
,也可以使用stripIndent()like
def a = """\
test
test
test""".stripIndent()
因为
前导空格数量最少的行决定要删除的数量。
您还需要缩进第一个“测试”,而不是将其直接放在初始 """
之后(\
确保多行字符串不以换行符开头)。
【讨论】:
\ 是什么意思? 我已经改进了我的最后一句话以更好地解释它。以上是关于Groovy 多行字符串有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章