Groovy多行字符串出了什么问题?

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

为什么?

yegor256 asked 2019-09-09T00:16:38Z
3个解决方案
202 votes

由于groovy没有EOL标记(例如|),如果将操作符放在以下行上会让人感到困惑

这将改为:

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

因为Groovy解析器知道在下一行上有所期待

Groovy将您的原始|视为三个单独的语句。 第一个指定testa,第二个指定"test"为正(这是它失败的地方)

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

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

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

将在三行上创建一个带有测试的String

此外,你可以通过以下方式使它更整洁:

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

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

tim_yates answered 2019-09-09T00:17:41Z
13 votes

"""类似,您还可以使用stripIndent()之类的

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

因为

前导空格数最少的行确定要删除的数量。

你还需要缩进第一个“测试”而不是直接放在初始化之后"""\确保多行字符串不以换行符开头)。

sschuberth answered 2019-09-09T00:18:25Z
11 votes

你可以告诉Groovy该语句应该通过添加一对括号\来评估结束的行。

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

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

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

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

cmcginty answered 2019-09-09T00:19:03Z
translate from https://stackoverflow.com:/questions/5079797/whats-wrong-with-groovy-multi-line-string