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


105

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

为什么?


5
万一它对其他人有帮助,您可以使用的代码获得相同的错误def a = b + + "/" + c。在这种情况下,两个+符号显然是问题所在。
Geoff Hackworth

Answers:


236

由于groovy没有EOL标记(例如;),因此如果您将运算符放在下一行会感到困惑

它将代替:

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

因为Groovy解析器知道在下一行有期望

Groovy将原始文档def视为三个单独的语句。第一个分配testa,第二个分配给"test"正号(这是失败的地方)

使用new String构造函数方法,Groovy解析器仍在构造函数中(因为花括号尚未关闭),因此它可以将三行逻辑地合并为一个语句

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

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

将通过三行测试创建一个字符串

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

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

stripMargin方法将修剪|每行的左侧(直到并包括字符)


6
或者直接使用stripIndent()代替stripMargin()
sschuberth 2015年

是的,并忽略|多余的字符
tim_yates 2015年

4
您可以在"""字符串中使用双引号
tim_yates 2015年

3
是的,我已经编辑了答案,以显示您需要如何稍微重新格式化代码才能stripIndent()正常工作。
sschuberth '17

2
因为a)我已经将其发布为评论,并且b)与该答案没有太大不同。
sschuberth

17

您可以通过添加一对圆括号来告诉Groovy,该语句的求值应超过行尾 ( ... )

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

第二种选择是\在每行的末尾使用反斜杠:

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

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


第二个也是VBA多行语句的工作方式:D(由于VBA,仅使用下划线而不是反斜杠。)
Charles Wood

第二种选择对我来说在Jenkinsfile中失败了。第一种选择有效。
SilverJan

Nitpick:使用parens时,Python多行字符串不需要连接运算符,因此它并不完全相同。
Big McLargeHuge

17

类似stripMargin(),你也可以使用stripIndent()一样

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

因为

前导空格最少的行确定要删除的号码。

您还需要缩进第一个“测试”,而不要直接将其放在缩写后面"""(以\确保多行字符串不以换行符开头)。


2
\有什么用?
乔·菲利普斯

4
我改进了最后一句话,以更好地解释它。
sschuberth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.