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 多行字符串有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy字符串 ( 字符串拼接 | 多行字符串 )

Groovy 字符串那点儿事儿

08-Groovy-数据类型-String介绍

groovy语法

Groovy02_字符串与循环

groovy语法