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"
)
为什么?
答案 0 :(得分:204)
由于groovy没有EOL标记(例如;
),如果你将操作符放在下一行上就会感到困惑
这样可以改为:
def a = "test" +
"test" +
"test"
因为Groovy解析器知道在下一行中有所期待
Groovy将原始def
视为三个单独的语句。第一个将test
分配给a
,后两个尝试将"test"
设为正(这是失败的地方)
使用new String
构造函数方法,Groovy解析器仍在构造函数中(因为大括号尚未关闭),因此它可以逻辑上将三行连接成一个语句
对于真正的多行字符串,您还可以使用三重引号:
def a = """test
test
test"""
将在三行上创建一个包含测试的字符串
另外,你可以通过以下方式使它更整洁:
def a = """test
|test
|test""".stripMargin()
stripMargin
method将从每行修剪左边(包括|
字符)
答案 1 :(得分:14)
与stripMargin()
类似,您也可以使用stripIndent()之类的
def a = """\
test
test
test""".stripIndent()
因为
前导空格数最少的行决定要删除的数字。
你还需要缩进第一个“测试”,而不是在初始"""
之后直接放置(\
确保多行字符串不以换行符开头)。
答案 2 :(得分:11)
你可以告诉Groovy该语句应该通过添加一对括号( ... )
def a = ("test"
+ "test"
+ "test")
第二种选择是在每行的末尾使用反斜杠\
:
def a = "test" \
+ "test" \
+ "test"
FWIW,这与Python多行语句的工作方式相同。