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。この場合、2つの+記号が明らかに問題です。
ジェフハックワース2013年

回答:


236

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

これは代わりに機能します:

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

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

Groovyは、オリジナルdefを3つの別個のステートメントと見なします。最初の割り当てtesta第二の二の試行は、作るために"test"正(と、それが失敗した場所です)

new String(ブレースがまだ閉じられていないとして)それは論理的に単一の文にまとめて3行に参加することができますので、コンストラクタメソッド、Groovyのパーサは、コンストラクタにまだあります

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

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

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

また、次の方法で見栄えをよくすることができます。

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

このstripMarginメソッド|、各行から左(charまで)をトリミングします


6
または、単にの代わりにstripIndent()を使用しますstripMargin()
sschuberth 2015

ええ、|余分な行のchars を省略します
tim_yates

4
"""文字列内では二重引用符を使用できます
tim_yates

3
答えを編集して、コードを少しだけ再フォーマットしてstripIndent()機能させる必要があることを示しました。
sschuberth 2017

2
なぜなら、a)既にコメントとして投稿しており、b)この回答とそれほど変わらないからです。
sschuberth 2017

17

括弧のペアを追加することで、ステートメントが行末を超えて評価されることをGroovyに伝えることができます ( ... )

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

2番目のオプションは\、各行の終わりにバックスラッシュを使用することです。

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

FWIW、これはPythonの複数行ステートメントが機能する方法と同じです。


2つ目は、VBAの複数行ステートメントがどのように機能するかも示しています:D(VBAのため、バックスラッシュではなくアンダースコアを使用した場合のみ)
Charles Wood

Jenkinsfileで2番目のオプションが失敗しました。最初のオプションが機能しました。
SilverJan

Nitpick:括弧を使用する場合、Pythonの複数行の文字列は連結演算子を必要としないため、まったく同じではありません。
Big McLargeHuge

17

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

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

のため

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

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


2
何のための\ですか?
ジョーフィリップス

4
私はそれをよりよく説明するために私の最後の文を改善しました。
sschuberth 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.