Что случилось с Groovy multi-line String?
Groovy scripts вызывает ошибку:
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 ответов:
поскольку groovy не имеет маркера EOL (например,
;) он запутывается, если вы ставите оператор на следующую строкуэто будет работать:
def a = "test" + "test" + "test"как заводной парсер знает, чтобы ожидать что-то на следующей строке
Groovy видит ваш оригинал
defкак три отдельных заявления. Первый присваиваетtestдоa, вторые два пытаются сделать"test"положительный (и это где он терпит неудачу)С
new Stringметод конструктора, Groovy parser все еще находится в конструкторе (поскольку скобка еще не закрыта), поэтому он может логически объединить три строки вместе в один оператордля истинных многострочных строк, вы также можете использовать тройной цитата:
def a = """test test test"""создаст строку с тестом на трех строках
кроме того, вы можете сделать его аккуратнее:
def a = """test |test |test""".stripMargin()the
stripMarginметод будет обрезать левый (до и в том числе|char) от каждой строки
аналогично
stripMargin(), вы также можете использовать stripIndent() какdef a = """\ test test test""".stripIndent()из-за
строка с наименьшим количеством ведущих пробелов определяет число для удаления.
вам также нужно отступить первый "тест" и не ставить его непосредственно после inital
"""(the\обеспечивает многострочная строка не начинается с новой строки).
вы можете сказать Groovy, что оператор должен оценивать мимо окончания строки, добавив пару скобок
( ... )def a = ("test" + "test" + "test")второй вариант-использовать обратную косую черту,
\В конце каждой строки:def a = "test" \ + "test" \ + "test"FWIW, это идентично тому, как работают многострочные операторы Python.
Comments