String 什么';Groovy多行字符串有什么问题?

String 什么';Groovy多行字符串有什么问题?,string,groovy,multiline,String,Groovy,Multiline,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" ) 为什么?因为groovy没有EOL标记(例如;),如果

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"
)

为什么?

因为groovy没有EOL标记(例如
),如果您将操作符放在下面的行上,它会变得混乱

相反,这会起作用:

def a = "test" +
  "test" +
  "test"
正如Groovy解析器所知道的,在下面的代码行中会出现一些东西

Groovy将原始的
def
看作三条独立的语句。第一个将
test
分配给
a
,第二个将尝试使
“test”
为正(这就是失败的地方)

使用
newstring
constructor方法,Groovy解析器仍然在构造函数中(因为大括号还没有关闭),因此它可以在逻辑上将三行连接到一条语句中

对于真正的多行字符串,还可以使用三重引号:

def a = """test
test
test"""
将在三行上创建一个带有test的字符串

此外,您还可以通过以下方式使其更整洁:

def a = """test
          |test
          |test""".stripMargin()

将从每一行修剪左边(最多包括
|
字符)

您可以告诉Groovy,该语句应该通过添加一对括号(…)

第二个选项是在每行末尾使用反斜杠,
\

def a = "test" \
  + "test" \
  + "test"

FWIW,这与Python多行语句的工作方式相同。

类似于
stripMargin()
,也可以使用like

因为

前导空格数最少的行决定要删除的行数


您还需要缩进第一个“test”,而不是将它直接放在inital
”(
\
确保多行字符串不会以换行符开头)。

如果它对其他人有帮助,您可以使用类似
def a=b++”的代码得到相同的错误/“+c
。在这种情况下,两个+符号显然是问题所在。或者简单地使用而不是
stripMargin()
。是的,并省略额外行上的
字符。您可以在
内使用双引号。“
stringsRight,我已经编辑了答案,以显示您需要如何稍微重新格式化代码以生成
stripIndent()
work。因为a)我已经把它作为评论发布了,b)它与这个答案没有太大区别。第二个问题也是VBA多行语句的工作原理:D(因为VBA,只能使用下划线而不是反斜杠。)第二个选项在Jenkins文件中失败。第一个选项有效。吹毛求疵:Python多行字符串在使用parens时不需要连接运算符,所以它不完全相同。为什么\呢?我改进了我的最后一句话,以便更好地解释它。
def a = "test" \
  + "test" \
  + "test"
def a = """\
        test
        test
        test""".stripIndent()