web-dev-qa-db-fra.com

Formater la chaîne en groovy

Je voudrais remplacer %s Par la valeur

<server>
    <id>artifactory</id>
    <username>%s</username>
    <password>%s</password>
</server>

Existe-t-il une méthode myString.format("name", "pass") dans groovy?

9
Rudziankoŭ

En rassemblant les réponses et les commentaires ci-dessus au même endroit, il existe deux approches:

  1. Basé sur Java String.format fonctionnalité voir ci-dessus , qui est en groovy enveloppé dans la fonction de confort sprintf voir par exemple ici ou ici
  2. Basé sur interpolation de chaîne et plus précisément dans ce cas .
  3. [modifier] Comme suggéré par ernest_k dans les commentaires, la meilleure solution pour les modèles est moteurs de modèle . Il est bien plus puissant, puis String.format nu, mais bien sûr, nécessite un peu d'apprentissage.

À mon avis personnel, la première option convient mieux à la question posée à l'origine, car elle permet de créer des chaînes de "modèle", qui peuvent ensuite être utilisées avec des paramètres arbitraires à un endroit arbitraire dans le code un nombre arbitraire de fois. Cela semble être le cas d'utilisation de la question d'origine.

En règle générale, il existe deux différences majeures entre l'interpolation de chaînes et sprintf:

  1. L'interpolation de chaînes ne permet pas de formater les valeurs.
  2. L'interpolation de chaîne est évaluée sur place, où elle est définie (dans sa forme normale), de sorte qu'elle ne permet pas le modèle. Même s'il est utilisé sous sa forme "spéciale" ({-> expr}), il n'a toujours pas d'acte explicite d'application de modèle, mais s'appuie plutôt sur des variables définies en externe avec des noms particuliers, ce qui est à mon avis moins fiable.

Pour illustrer le cas d'utilisation des modèles, considérez:

// can be defined in the same function, or as static variable in the class or even
// in other class
final String URL_TEMPLATE = 'http://fake.weather.com/rest/%s' // arg - country abbreviation

// ...

// Here we want to get weather for different countries.
def countries = ['US', 'DE', 'GB']
for (country in countries) {
    def url = URL_TEMPLATE.format(country)
    // send the request, accumulate the results
}

Cette solution n'est pas facile à utiliser en utilisant l'interpolation de chaînes. Bien sûr, j'admets, qu'il est toujours possible de construire la solution également basée sur l'interpolation de chaînes, mais cela aurait l'air très différent.

0
Dmitrii Semikin