1

字符串内插

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\nb"
"""a\nb"""

自定义

类似的,可以自定义字符串的内插的定义,彻底体现了Scala可扩展性的哲学思维。例如,定义JSON的字符串表示。

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

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

horance
255 声望29 粉丝

刘光聪,程序员,敏捷教练,开源软件爱好者,具有多年大型遗留系统的重构经验,对OO,FP,DSL等领域具有浓厚的兴趣。


引用和评论

0 条评论