web-dev-qa-db-ja.com

Groovyの複数行の文字列の何が問題になっていますか?

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

どうして?

89
yegor256

GroovyにはEOLマーカーがないため(;)次の行に演算子を配置すると混乱します

これは代わりに動作します:

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

groovyパーサーは次の行に何かを期待することを知っているので

Groovyは、元のdefを3つの別個のステートメントとして認識します。最初はtestaに割り当て、2番目は2つを"test"ポジティブ(そしてこれが失敗する場所)

とともに new Stringコンストラクターメソッド、Groovyパーサーはまだコンストラクターにあるため(ブレースがまだ閉じていないため)、3行を論理的に1つのステートメントに結合できます。

真の複数行文字列の場合、三重引用符も使用できます。

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

3行のテストで文字列を作成します

また、次の方法できれいにできます。

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

stripMargin method は、左(| char)各行から

208
tim_yates

stripMargin()と同様に、 stripIndent() を使用することもできます

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

のため

先行スペースの数が最も少ない行によって、削除する数が決まります。

最初の「テスト」もインデントする必要があり、最初の"""の直後に配置しないでください(\は、複数行の文字列が改行で始まらないようにします)。

15
sschuberth

括弧のペア( ... )

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

2番目のオプションは、バックスラッシュ\、各行の最後:

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

FWIW、これはPython複数行ステートメントの動作と同じです。

11
cmcginty