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