Что случилось с 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"
)


почему?

564   3  

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

    Ничего не найдено.