Что случилось с 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"
)
Почему?
Ответы
Ответ 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.