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"
<console>: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)