web-dev-qa-db-fra.com

Quel est le problème avec Groovy multi-line String?

Les scripts Groovy soulèvent une erreur:

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

Erreur:

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

Bien que ce script fonctionne bien:

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

Pourquoi?

89
yegor256

Comme groovy n’a pas de marqueur EOL (comme ;) cela devient confus si vous mettez l'opérateur sur la ligne suivante

Cela fonctionnerait à la place:

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

comme le sait l'analyseur Groovy, il faut s'attendre à quelque chose sur la ligne suivante

Groovy voit votre def original sous la forme de trois instructions distinctes. Le premier assigne test à a, les deux autres essaient de faire "test" positif (et c’est là que ça échoue)

Avec le new String méthode constructeur, l’analyseur Groovy est toujours dans le constructeur (l’accolade n’ayant pas encore été fermé), il peut donc relier logiquement les trois lignes en une seule instruction

Pour les véritables chaînes multi-lignes, vous pouvez également utiliser la citation triple:

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

Va créer une chaîne avec test sur trois lignes

En outre, vous pouvez le rendre plus propre en:

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

la stripMargin methode coupera la gauche (jusqu'à la | char) de chaque ligne

208
tim_yates

Semblable à stripMargin(), vous pouvez également utiliser stripIndent () comme

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

À cause de

La ligne contenant le moins d'espaces en début de ligne détermine le nombre à supprimer.

vous devez également indenter le premier "test" et ne pas le mettre directement après le """ initial (le \ garantit que la chaîne multiligne ne commence pas par une nouvelle ligne).

15
sschuberth

Vous pouvez dire à Groovy que l'instruction doit être évaluée au-delà de la ligne se terminant en ajoutant une paire de parenthèses ( ... )

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

Une deuxième option consiste à utiliser une barre oblique inversée, \, à la fin de chaque ligne:

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

FWIW, ceci est identique au fonctionnement des instructions multi-lignes Python).

11
cmcginty