Подтвердить что ты не робот

Что случилось с Groovy многострочной строкой?

Groovy скрипты вызывают ошибку:

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

Ошибка:

No signature of method: java.lang.String.positive() is 
applicable for argument types: () values: []

Пока этот script работает нормально:

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

Почему?

4b9b3361

Ответ 1

Поскольку 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 будет обрезать слева (до и включая | char) из каждой строки

Ответ 2

Подобно stripMargin(), вы также можете использовать stripIndent() как

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

Из-за

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

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

Ответ 3

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

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

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

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

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