相关文章推荐
个性的单杠  ·  java ...·  2 周前    · 
贪玩的上铺  ·  javascript - ...·  1 周前    · 
光明磊落的花生  ·  SpeechSynthesizer 类 ...·  6 月前    · 
爱看球的太阳  ·  python 实现读取txt ...·  1 年前    · 
沉稳的萝卜  ·  linux下导入mysql ...·  1 年前    · 
精彩文章免费看

scala字符串插入

scala的字符串插入,与java语言的 String.format(String str, Object... val) 有类似之处,都是最终用字符串变量去替代字符串中的 变量占位符 。Scala中主要有 s , f , raw 三种字符串插值用法,另外还有一些高级用法,本文主要参考官网 字符串插入

val name = "James"
println(s"Hello, $name")  // Hello, James
println(s"1 + 1 = ${1 + 1}") // 1+1 =2
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 =
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)
最后编辑于:2017-12-11 08:07