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"
)
为什么?
由于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
方法会从每一行中去掉左边的空格(包括 |
字符)。
"""
字符串内部使用双引号。 - tim_yatesstripIndent()
起作用。 - sschuberthstripIndent()
的修改被撤销了?在我看来,它使这个答案更加强大。 - jr.和 stripMargin()
相似,你也可以使用 stripIndent() 方法
def a = """\
test
test
test""".stripIndent()
由于缩进最少的一行决定了需要去除的空格数,所以你还需要对第一个“test”进行缩进,并且不要直接将其放在初始的"""
后面(\
确保多行字符串不会以换行符开头)。
你可以在语句前后添加一对圆括号( ... )
,告诉Groovy应该在行末进行评估。
def a = ("test"
+ "test"
+ "test")
第二个选项是在每行末尾使用反斜杠\
:
def a = "test" \
+ "test" \
+ "test"
顺便提一句,这与 Python 的多行语句的工作方式完全相同。
def a = b + + "/" + c
这样的代码产生相同的错误。在这种情况下,显然两个加号符号是问题所在。 - Geoff Hackworth