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

时间:2011-02-22 15:01:03

标签: string 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"
)

为什么?

3 个答案:

答案 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多行语句的工作方式相同。