Scala Essentials: 字符串內插

字符串內插

Scala是一門高度可擴展性的程序設計語言,保持微小的內核,但具備無窮大的擴展能力。例如,「字符串內插」功能,Scala語言並非原生地支持該特性,而是經過類庫的擴展來實現的。json

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

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

  • 支持其餘形式的字符串的內插功能,例如s, f, rawscala

  • 支持用戶自定義字符串的內插功能;設計

剖析本質

package scala

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

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

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

等價於:orm

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

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

raw"a\nb"
"""a\nb"""

自定義

相似的,能夠自定義字符串的內插的定義,完全體現了Scala可擴展性的哲學思惟。例如,定義JSON的字符串表示。字符串

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

val conf = json"{ a: $a }"
相關文章
相關標籤/搜索