Что не так с Groovy многострочной строки - PullRequest
88 голосов
/ 22 февраля 2011

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 ]

205 голосов
/ 22 февраля 2011

Так как у 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 метод воляобрежьте влево (до | символа) от каждой строки

14 голосов
/ 25 июля 2017

Аналогично stripMargin(), вы также можете использовать stripIndent () как

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

Из-за

Строка с наименьшим количеством начальных пробелов определяет номер для удаления.

вам также нужно сделать отступ для первого «теста» и не ставить его сразу после начального """ (\ гарантирует, что многострочная строка не начинается с новой строки).

11 голосов
/ 29 июля 2016

Вы можете сказать Groovy, что оператор должен вычисляться после окончания строки, добавив пару скобок ( ... )

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

Второй вариант - использовать обратную косую черту \ в конце каждой строки:

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

FWIW, это идентично тому, как работают многострочные операторы Python.

...