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

158

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

为什么?


6
如果对其他人有帮助的话,你可以使用类似 def a = b + + "/" + c 这样的代码产生相同的错误。在这种情况下,显然两个加号符号是问题所在。 - Geoff Hackworth
您可以查看Groovy多行字符串文档:https://www.baeldung.com/groovy-strings - Tal Jacob - Sir Jacques
3个回答

299

由于Groovy没有类似 ; 的行结束标记,所以如果您将运算符放在以下行中,它会感到困惑。

相反,可以使用以下方式:

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

由于Groovy解析器知道在下一行会有一些东西,所以Groovy将原始的def视为三个独立语句。第一个将test分配给a,而后两个则试图使"test"变成正数(这就是失败的原因)。

使用new String构造方法时,Groovy解析器仍在构造函数中(因为大括号还没有关闭),因此逻辑上可以将这三行合并为单个语句。

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

def a = """test
test
test"""

将创建一个带有三行“test”的字符串

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

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

stripMargin 方法会从每一行中去掉左边的空格(包括 | 字符)。


12
可以使用stripIndent()代替stripMargin(),具体用法请参考stripIndent()。 - sschuberth
5
可以在 """ 字符串内部使用双引号。 - tim_yates
3
好的,我已经编辑了答案以展示如何轻微地重新格式化代码来使 stripIndent() 起作用。 - sschuberth
2
因为a)我已经将其作为评论发布了,b)它与此答案没有太大区别。 - sschuberth
1
为什么 stripIndent() 的修改被撤销了?在我看来,它使这个答案更加强大。 - jr.
显示剩余5条评论

46

stripMargin() 相似,你也可以使用 stripIndent() 方法

def a = """\
        test
        test
        test""".stripIndent()

由于缩进最少的一行决定了需要去除的空格数,所以你还需要对第一个“test”进行缩进,并且不要直接将其放在初始的"""后面(\确保多行字符串不会以换行符开头)。


4
反斜线“\”有什么用途? - Joe Phillips
4
我已经改进了上一句话,以更好地解释它。 - sschuberth

27

你可以在语句前后添加一对圆括号( ... ),告诉Groovy应该在行末进行评估。

def a = ("test"
  + "test"
  + "test")

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

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

顺便提一句,这与 Python 的多行语句的工作方式完全相同。


第二个例子也是VBA多行语句的工作方式:D(只不过使用下划线而不是反斜杠,因为是VBA。) - Charles Wood
1
在 Jenkinsfile 中,第二个选项对我失败了。第一个选项可行。 - SilverJan
6
细节:Python多行字符串在使用括号时不需要使用连接运算符,因此它们并不完全相同。 - Big McLargeHuge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接