字串內插
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 }"