scala字符串插入

scala的字符串插入,与java语言的String.format(String str, Object... val)有类似之处,都是最终用字符串变量去替代字符串中的变量占位符。Scala中主要有s,f,raw三种字符串插值用法,另外还有一些高级用法,本文主要参考官网字符串插入。

s用法

val name = "James"
println(s"Hello, $name")  // Hello, James
println(s"1 + 1 = ${1 + 1}") // 1+1 =2

f用法

正确方式

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

错误方式:类型转化错误

val height: Double = 1.9d

scala> f"$height%4d"
:9: error: type mismatch;
 found   : Double
 required: Int
           f"$height%4d"

raw用法

scala> s"a\nb"
res0: String =
a
b

对比

scala> raw"a\nb"
res1: String = a\nb

可以看出raw用法对转义字符不做任何特别处理


高级用法

如果你遇到下面这种字符串表达:

id"string content"

scala会将其转换为StringContext实例上的一个方法(id)的调用,方法(id)的实际输入参数是字符串 string content。看下面的例子

implicit class JsonHelper(val sc: StringContext) extends AnyVal {
  def json(args: Any*): JSONObject = sys.error("TODO - IMPLEMENT")
}

def giveMeSomeJson(x: JSONObject): Unit = ...

giveMeSomeJson(json"{ name: $name, id: $id }")

当scala编译器遇到json"{ name: $name, id: $id }"时,会如下处理

new StringContext("{ name: ", ", id: ", " }").json(name, id)

隐式类的存在,使得json方法有效,所以接着会改写成

new JsonHelper(new StringContext("{ name: ", ", id: ", " }")).json(name, id)

你可能感兴趣的:(scala字符串插入)