Scala字符穿插值器

2.10.0版本开始,Scala提供了三种创新的字符串插值方法: s、f 和 raw
2.11.0版本开始,用于模式匹配patter match

小结:
s: 
    s"Hello, $name"   //变量插值
    s"1 + 1 = ${1+1}" //任意表达式插值
f:
    f"$name%s is $height%2.2f meters tall" //插值后,格式化字符串
raw:
    raw"a\nb"  //对子面值中的字符不做编码  \n、\t等都不编译

自定义插值,用到在学

s字符串插值器

在任何字符串前加上s,就可以直接在串中使用变量了。

scala> val name = "James"
name: String = James

scala> s"Hello, $name"
res2: String = Hello, James

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

任何表达式都可以嵌入到${}中

scala> println(s"1 + 1 = ${1+1}")
1 + 1 = 2

f插值器

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

当使用f插值器的时候,所有的变量引用都应当后跟一个printf-style格式的字符串,如%d、%s.

scala> val height = 1.9d
height: Double = 1.9

scala> val name = "James"
name: String = James

scala> f"$name%s is $height%2.2f meters tall"
James is 1.90 meters tall

如果试图向只支持int的格式化串传入一个double值,则编译器会报错

scala> val height: Double = 1.9d
height: Double = 1.9

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

^f插值器利用了Java中的字符串数据格式

如果在具体变量后没有%,则格式化程序默认使用%s(串型)格式

这种以%开头的格式在[Formatter javadoc]中有相关描述。

raw插值器

除了对子面值中的字符不做编码外,raw插值器与s插值器在功能上是相同的。

如下是个被处理过的字符串

scala> s"a\nb"
res0: String =
a
b       //此处解析了\n

scala> raw"a\nb"
res1: String = a\nb //此处没有解析\n

除了 以上三种字符串插值器外,使用这可以自定义插值器

高级用法 (先暂搁置,需要再来学)

在Scala中,所有处理过的字符串字面值都进行了简单转码转换,任何时候编译器遇到一个如下形式的字符串子面值: id"string contect"它都会被转换称一个StringContext实例的call(id)方法。这个方法在隐式范围内仍可用。 只需要简单的建立一个隐式类,给StringContext实例对象添加一个新方法,便可以定义我们自己的 字符串插值器。

参考https://blog.csdn.net/u013063153/article/details/75599681

posted @ 2019-05-15 01:03  BBBone  阅读(353)  评论(0编辑  收藏  举报