Scala编程(第5版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.3 字符串插值

Scala包括了一个灵活的机制来支持字符串插值,允许在字符串字面量中嵌入表达式。最常见的用途是为字符串拼接提供一个更精简和易读的替代方案。举个例子:

表达式s"Hello, $name!"是一个被处理的processed)字符串字面量。由于字母s出现在首个双引号前,Scala将使用s这个字符串插值器来处理该字面量。s字符串插值器会对内嵌的每个表达式求值,对求值结果调用toString方法,替换掉字面量中的那些表达式。因此,s"Hello, $name!"会交出"Hello, reader!",与"Hello, " + name + "!"的结果一样。

在被处理的字符串字面量中,可以随时用美元符号($)开始一个表达式。对于那些单变量的表达式,通常可以在美元符号后面直接给出变量的名称。Scala将从美元符号开始到首个非标识符字符的部分作为表达式。如果表达式包含了非标识符字符,就必须将它放在花括号中,左花括号需要紧跟美元符号。例如:

Scala默认还提供了两种字符串插值器:rawfraw字符串插值器的行为与s字符串插值器的类似,不过它并不识别字符转义序列(比如,表5.2给出的那些)。举例来说,如下语句将打印出4个反斜杠,而不是2个反斜杠:

f字符串插值器允许给内嵌的表达式加上printf风格的指令。你需要将指令放在表达式之后,以百分号(%)开始,使用java.util.Formatter中给出的语法。比如,可以这样来格式化π:

如果不对内嵌表达式给出任何格式化指令,则f字符串插值器将默认使用%s,其含义是用toString方法的值来替换,就像s字符串插值器那样。例如:

在Scala中,字符串插值是通过在编译期重写代码来实现的。编译器会将任何由某个标识符紧接着字符串字面量的(左)双引号这样的表达式当作字符串插值器表达式处理。我们在前面看到的字符串插值器sfraw,就是通过这个通用的机制实现的。类库作者和用户可以定义其他字符串插值器来满足不同的用途。