Groovy 다중 행 문자열의 문제점은 무엇입니까?


105

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"
)

왜?


5
다른 사람에게 도움이되는 경우, def a = b + + "/" + c. 이 경우 두 개의 + 기호가 분명히 문제입니다.
Geoff Hackworth 2013

답변:


236

groovy에는 EOL 마커 (예 :)가 없기 ;때문에 연산자를 다음 줄에 넣으면 혼란스러워집니다.

이것은 대신 작동합니다.

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

Groovy 파서는 다음 줄에서 무언가를 기대하는 것을 알고 있기 때문에

Groovy는 원본 def을 세 개의 개별 진술로 간주합니다 . 제 양수인 test에게 a번째 두 시도가 만드는 "test"(실패 곳이있다) 긍정적

new String논리적으로 하나의 명령문에 함께 산신 참여할 수 있도록 생성자 메소드 그루비 파서 (브레이스가 아직 폐쇄되지 않은 바와 같이) 생성자 여전히

진정한 여러 줄 문자열의 경우 삼중 따옴표를 사용할 수도 있습니다.

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

세 줄의 테스트로 문자열을 만듭니다.

또한 다음과 같은 방법으로 깔끔하게 만들 수 있습니다.

def a = """test
          |test
          |test""".stripMargin()

stripMargin메서드|각 줄에서 왼쪽 ( 문자 포함 )을 자릅니다.


6
또는 단순히 . 대신 stripIndent ()를 사용하십시오 stripMargin().
sschuberth

그래, 그리고 생략 |여분의 줄에 문자를
tim_yates

4
"""문자열 안에 큰 따옴표를 사용할 수 있습니다
tim_yates

3
맞습니다 stripIndent(). 작업 을 위해 코드를 약간 다시 포맷해야하는 방법을 보여주기 위해 답변을 편집 했습니다.
sschuberth

2
a) 이미 댓글로 게시했고 b)이 답변과 크게 다르지 않기 때문입니다.
sschuberth

18

와 유사하게 stripIndent ()를 다음 과 같이 stripMargin()사용할 수도 있습니다.

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

때문에

가장 적은 수의 선행 공백이있는 줄은 제거 할 수를 결정합니다.

당신은 또한 최초의 "테스트"들여 쓰기와 inital 후 직접 넣지 필요 """합니다 ( \보장하지만이 여러 줄 문자열은 줄 바꿈으로 시작되지 않습니다).


2
\는 무엇입니까?
Joe Phillips

4
더 잘 설명하기 위해 마지막 문장을 개선했습니다.
sschuberth

17

한 쌍의 괄호를 추가하여 명령문이 줄 끝을지나 평가되어야한다고 Groovy에게 알릴 수 있습니다. ( ... )

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

두 번째 옵션은 \각 행의 끝에 백 슬래시를 사용하는 것입니다 .

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

FWIW, 이것은 파이썬 여러 줄 문이 작동하는 방식과 동일합니다.


두 번째는 VBA 여러 줄 문이 작동하는 방식입니다. D (VBA 때문에 백 슬래시 대신 밑줄 만 사용합니다.)
Charles Wood

Jenkinsfile에서 두 번째 옵션이 실패했습니다. 첫 번째 옵션이 작동했습니다.
SilverJan 19

Nitpick : Python 여러 줄 문자열은 괄호를 사용할 때 연결 연산자가 필요하지 않으므로 정확히 동일하지 않습니다.
Big McLargeHuge
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.