1. 前言
自2.10.0版本开始,Scala提供了一种新的机制来根据数据生成字符串:字符串插值。字符串插值允许使用者将变量引用直接插入处理过的字面字符中。如下例:
val name="James"
println(s"Hello,$name")//Hello,James
在上例中, s"Hello,$name"
是待处理字符串字面,编译器会对它做额外的工作。待处理字符串字面通过"
号前的字符来标示(例如:上例中是s
)。字符串插值的实现细节在 SIP-11 中有全面介绍。
2. 用法
Scala 提供了三种创新的字符串插值方法:s
,f
和raw
.
2.1 s
字符串插值器
在任何字符串前加上s
,就可以直接在串中使用变量了。你已经见过这个例子:
val name="James"
println(s"Hello,$name")//Hello,James 此例中,$name嵌套在一个将被s字符串插值器处理的字符串中。插值器知道在这个字符串的这个地方应该插入这个name变量的值,以使输出字符串为Hello,James。使用s插值器,在这个字符串中可以使用任何在处理范围内的名字。
字符串插值器也可以处理任意的表达式。例如:
println(s"1+1=${1+1}") 将会输出字符串1+1=2。任何表达式都可以嵌入到`${}`中。
2.2 f
插值器
在任何字符串字面前加上f
,就可以生成简单的格式化串,功能相似于其他语言中的 printf 函数。当使用 f
插值器的时候,所有的变量引用都应当后跟一个printf-style格式的字符串,如%d
。看下面这个例子:
val height=1.9d
val name="James"
println(f"$name%s is $height%2.2f meters tall")//James is 1.90 meters tall f 插值器是类型安全的。如果试图向只支持 int 的格式化串传入一个double 值,编译器则会报错。例如:
val height:Double=1.9d
scala>f"$height%4d"
<console>:9: error: type mismatch;
found : Double
required: Int
f"$height%4d"
^ f 插值器利用了java中的字符串数据格式。这种以%开头的格式在 [Formatter javadoc] 中有相关概述。如果在具体变量后没有%,则格式化程序默认使用 %s(串型)格式。
2.3 raw
插值器
除了对字面值中的字符不做编码
外,raw
插值器与 s
插值器在功能上是相同的。如下是个被处理过的字符串:
scala>s"a\nb"
res0:String=
a
b 这里,s 插值器用回车代替了\n。而raw插值器却不会如此处理。
scala>raw"a\nb"
res1:String=a\nb 当不想输入\n被转换为回车的时候,raw 插值器是非常实用的。
3. 限制
字符串插值目前对模式匹配语句不适用。此特性将在2.11版本中生效。