Scalaでの文字列補間
1. 概要
このチュートリアルでは、ScalaでString補間を実装する方法を見ていきます。
文字列補間により、プレースホルダーを含むリテラル文字列の評価が可能になり、すべてのプレースホルダーが対応する値に置き換えられた文字列が生成されます。
2. s補間器
s補間器を使用すると、リテラル文字列で変数を直接使用できます。
val age = 30
val agePresentation= s"I am $age"
// "I am 30"
ダブル$で特殊文字$をエスケープできます。
"It is about $$30"
// "It is about $30"
3. f補間器
f補間器はタイプセーフであり、Java開発者にはおなじみですprintfメソッドを使用したフォーマット:
val height = 1.7d
val name = "Michele"
println(f"My name is $name%s. I am $age%d years old and $height%1.2f meters tall")
// My name is Michele. I am 30 years old and 1,70 meters tall
println(f"My name is $name%d.")
// type safe feature: error type mismatch!
// found : String - required: Int
サポートされているすべてのフォーマットはJavaで使用されているものと同じであるため、Javaフォーマットタイプのドキュメントを確認できます。
4. 生の補間器
生の補間器はリテラルのエスケープをサポートしていませんが、sおよびfと非常によく似ています。
理解を深めるために、例を見てみましょう。
raw"My name is $name%s. \n $agePresentation and $height%1.2f meters"
// My name is Michele%s. \n I am 30 and 1.7%1.2f meters
f"My name is $name%s. \n $agePresentation and $height%1.2f meters tall"
/*
My name is Michele.
I am 30 and 1.70 meters tall
*/
5. カスタム補間器
カスタム補間を作成することもできます。文字列を補間して大文字にする簡単な例を見てみましょう。
def custom(args: Any*): String = {
val stringContextIterator = sc.parts.iterator
val argsIterator = args.iterator
val sb = new java.lang.StringBuilder(stringContextIterator.next())
while (argsIterator.hasNext) {
sb.append(argsIterator.next().toString)
sb.append(stringContextIterator.next())
}
sb.toString.toUpperCase()
}
StringContext オブジェクトの暗黙的なメソッドは、カスタム補間器を表し、文字列で補間するためのパラメーターを受け取ります。 その結果、この例では、文字列を補間し、大文字にします。
実装に満足したら、任意の文字列で使用できます。
val testString = "well"
custom"the custom interpolator works $testString as expected"
// THE CUSTOM INTERPOLATOR WORKS WELL AS EXPECTED
カスタム補間器を文字列インスタンスの前に付けて、Scalaコンパイラーは最終的にコードを次のように拡張します。
new StringContext("the custom interpolator works ", " as expected").custom(testString)
その結果、カスタム補間ロジックは、StringContextオブジェクトをtestString値と大文字の文字列で補間します。
6. 結論
この記事では、Scalaで文字列補間を使用するさまざまな方法を見てきました。 また、カスタム補間を定義する方法についても説明しました。
最後に、この記事の完全なコードは、GitHubでから入手できます。