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から入手できます。