饭窝

活捉一只 Android 狗

Loshine's avatar Loshine

Scala 字符串插值器

Scala 提供了三种创新的字符串插值方法:s,fraw,使用他们我们可以方便快捷的组合字符串。

用法

s 字符串插值器

在任何字符串前加上s,就可以直接在串中使用变量了,在生成字符串的时候会隐式调用其toString方法。

class Complex(val real: Double, val imaginary: Double) {

  override def toString: String = {
    s"Complex(real=$real, imaginary=$imaginary)"
  }
}

val complex = new Complex(23, -1.3)

println(s"$complex")

字符串插值器也可以处理任意的表达式:

println(s"1+1=${1 + 1}")

f 插值器

在任何字符串字面前加上f,就可以生成简单的格式化串,功能相似于其他语言中的printf函数。

类似于 Java 中的String.format

val height = 1.9d
val name = "James"
println(f"$name%s is $height%.2f meters tall") //James is 1.90 meters tall

raw 插值器

raw插值器可以保证其内的字符不被编码,如\n不会被处理为回车

println(s"a\nb")  // a回车b
println(raw"a\nb")  // a\nb

高级用法

在 worksheet 中输入如下代码运行

id"string content"

发现编译器提示:Error:(1, 68) value id is not a member of StringContext

即:该格式会隐式调用 StringContext 的与前缀插值器同名的方法

所以我们自定义插值器只需要这样就可以了:

implicit class JsonHelper(val sc: StringContext) extends AnyVal {
  def json(args: Any*): String = {
    val strings = sc.parts.iterator
    val expressions = args.iterator
    var buf = new StringBuffer(strings.next)
    while (strings.hasNext) {
      buf append expressions.next
      buf append strings.next
    }
    parseJson(buf)
  }
}

结语

字符串插值器可以帮助我们快速格式化字符串,s会隐式调用其toString方法,f需要格式模板字符串,raw不会编码字符,我们只需要按需使用即可。