Scala Essentials: 字串內插

horance發表於2019-02-16

字串內插

Scala是一門高度可擴充套件性的程式設計語言,保持微小的核心,但具有無窮大的擴充套件能力。例如,「字串內插」功能,Scala語言並不是原生地支援該特性,而是通過類庫的擴充套件來實現的。

println(s"$name is $age years old.")

相對於Ruby的字串內插功能,Scala在字串前加入s的字首,顯得不是那麼優雅,但如此的設計換取了良好的可擴充套件性:

  • 支援其他形式的字串的內插功能,例如s, f, raw

  • 支援使用者自定義字串的內插功能;

剖析本質

package scala

case class StringContext(parts: String*) {
  def s(args: Any*): String = ???
  def f(args: Any*): String = ???
  def raw(args: Any*): String = ???
}

s其本質僅僅是一個函式而已。類似地,f函式支援格式化的字串內插功能;

f"$name%s is ${height}%2.2f meters tail"

等價於:

"%s is %2.2f meters tail".format(name, height)

但是,String.format可讀性相對於f較差。raw表示在不轉義字元場景下的字串內插,類似於"""string"""三引號的字串常量。

raw"a
b"
"""a
b"""

自定義

類似的,可以自定義字串的內插的定義,徹底體現了Scala可擴充套件性的哲學思維。例如,定義JSON的字串表示。

implicit class JsonHelper(val sc: StringContext) extends AnyVal {
  def json(args: Any*): JSONObject = ???
}

val conf = json"{ a: $a }"

相關文章