web-dev-qa-db-ja.com

Groovyのフォーマット文字列

_%s_を値に置き換えたい

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

GroovyにはmyString.format("name", "pass")メソッドはありますか?

9
Rudziankoŭ

上記の回答とコメントを1か所に集めるには、2つの方法があります。

  1. Java String.format機能 上記参照 に基づいています。これは、便利な関数sprintfにラップされたグルーヴィーなものです-例 こちら または ここ
  2. 文字列補間 、より具体的には この場合 に基づいています。
  3. [編集]コメントのernest_kで提案されているように、テンプレート化のより良い解決策は テンプレートエンジン です。それはより強力で、それから裸のString.formatですが、もちろん、ある程度の学習が必要です。

私の個人的な意見では、最初のオプションは最初に尋ねられた質問により適しています。これは、「テンプレート」文字列を作成できるため、コードの任意の場所の任意の場所で任意のパラメーターを使用できるためです。これは、元の質問のユースケースのようです。

一般に、文字列補間とsprintfの間には2つの大きな違いがあります。

  1. 文字列補間では、値をフォーマットできません。
  2. 文字列補間は、定義された場所で(通常の形式で)評価されるため、テンプレート化できません。 「特別な」形式({-> expr})で使用しても、テンプレートアプリケーションの明示的な動作はなく、特定の名前で外部定義された変数に依存するため、信頼性は低くなります。

テンプレートのユースケースの例として、次のことを考慮してください。

// 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
}

このソリューションは、文字列補間を使用するのは簡単ではありません。もちろん、文字列補間にも基づいてソリューションを構築することは依然として可能ですが、見た目は大きく異なります。

0
Dmitrii Semikin