Groovy multi-line String'in nesi var?


106

Harika komut dosyaları bir hataya neden oluyor:

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

Hata:

No signature of method: java.lang.String.positive() is 
applicable for argument types: () values: []

Bu komut dosyası iyi çalışsa da:

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

Neden?


5
Başkasına yardımcı olması durumunda, aynı hatayı gibi kodlarla alabilirsiniz def a = b + + "/" + c. Bu durumda, iki + sembolü açık bir şekilde problemdir.
Geoff Hackworth

Yanıtlar:


237

Groovy'de EOL işaretçisi olmadığı için (örneğin ;) operatörü aşağıdaki satıra koyarsanız kafası karışır.

Bunun yerine bu işe yarar:

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

Groovy ayrıştırıcısı aşağıdaki satırda bir şey beklediğini bildiği için

Groovy, orijinalinizi defüç ayrı ifade olarak görür . Birinci atar testiçin aikinci iki denemede, yapmak "test"(burada başarısız ve bu) pozitif

İle new Stringmantıksal tek bir bildirim haline araya üç satır katılmak böylece yapıcı yöntemine, Groovy ayrıştırıcı, (ayracı henüz kapatılmamış gibi) yapıcısı hala

Gerçek çok satırlı Dizeler için üçlü alıntı da kullanabilirsiniz:

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

Üç satırda test ile bir String oluşturacak

Ayrıca, şunları yaparak daha düzgün hale getirebilirsiniz:

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

stripMarginyöntem (kadar ve sol kırpmak |her hattan karbonlaşmış madde)


6
Veya yerine stripIndent () kullanın stripMargin().
sschuberth

Evet, ve |ekstra satırlardaki karakterleri
atla

4
"""Dizelerin içinde çift tırnak kullanabilirsiniz
tim_yates

3
Doğru, stripIndent()çalışmak için kodu nasıl biraz yeniden biçimlendirmeniz gerektiğini göstermek için cevabı düzenledim .
sschuberth

2
Çünkü a) bunu bir yorum olarak zaten göndermiştim ve b) bu ​​cevaptan pek farklı değil.
sschuberth

18

Benzer stripMargin(), ayrıca kullanabilirsiniz stripIndent () gibi

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

Yüzünden

En az sayıda önde boşluk içeren satır, kaldırılacak sayıyı belirler.

Ayrıca ilk "testi" girmeniz ve ilk testin hemen sonrasına koymamanız gerekir """\ baştan (bu , çok satırlı dizenin yeni satırla başlamamasını sağlar).


2
ne için?
Joe Phillips

4
Son cümlemi daha iyi açıklamak için geliştirdim.
sschuberth

17

Groovy'ye, bir çift parantez ekleyerek ifadenin satır sonunun ötesine geçmesi gerektiğini söyleyebilirsiniz. ( ... )

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

İkinci bir seçenek, \her satırın sonunda ters eğik çizgi kullanmaktır :

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

FWIW, bu Python çok satırlı ifadelerin çalışma şekliyle aynıdır.


İkincisi, VBA çok satırlı ifadelerinin nasıl çalıştığıdır: D (Yalnızca ters eğik çizgi yerine alt çizgilerle, çünkü VBA.)
Charles Wood

İkinci seçenek bir Jenkins dosyasında benim için başarısız oldu. İlk seçenek işe yaradı.
SilverJan

Nitpick: Python çok satırlı dizge, parens kullanılırken birleştirme operatörü gerektirmez, bu nedenle tam olarak aynı değildir.
Big McLargeHuge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.