Groovy 多行 String 有什么问题?

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

为什么?

135363 次浏览

由于 groovy 没有 EOL 标记(比如 ;) ,所以如果您将操作符放在下面的行中,它会感到困惑

相反,这种做法会奏效:

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

因为 Groovy 解析器知道在以下行中会出现一些东西

Groovy 将原始 def视为三个独立的语句。第一个将 test赋值给 a,第二个尝试使 "test"为阳性(这就是它失败的地方)

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

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

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

将创建一个 String,其中包含三行 test

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

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

stripMargin将从每一行中修剪左边(直到并包括 |字符)

您可以通过添加一对括号 ( ... )来告诉 Groovy 语句的计算应该超过行结尾

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

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

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

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

stripMargin()类似,您也可以使用 StripIndent ()

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

因为

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

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