Scala
是一门高度可扩展性的程序设计语言,保持微小的内核,但具备无穷大的扩展能力。例如,「字符串内插」功能,Scala
语言并非原生地支持该特性,而是经过类库的扩展来实现的。json
println(s"$name is $age years old.")
相对于Ruby
的字符串内插功能,Scala
在字符串前加入s
的前缀,显得不是那么优雅,但如此的设计换取了良好的可扩展性:函数
支持其余形式的字符串的内插功能,例如s, f, raw
;scala
支持用户自定义字符串的内插功能;设计
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 }"