我想对Scala中的自定义字符串插值有所了解。我正在查看此页面上的示例-> https://www.scala-lang.org/api/2.12.6/scala/StringContext.html
如果我理解正确,编译器将以不同的字面量(无空格)解释任何字符串。例如:s“ abc”
这似乎由编译器翻译为case类的实例-StringContext。该案例类采用> = 1个字符串作为参数。
[当我们使用s,f或raw以外的文字时,它将成为自定义插值器,我们需要具有隐式转换的功能。
在以上链接中给出的示例中,隐式类JsonHelper-采用StringContext值。在调用中:val x: JSONObject = json"{ a: $a }"
,我不了解如何将{ a: $a }
制成StringContext以及如何在函数定义中使用它。
有人可以帮我吗。
谢谢!
不是转换为StringContext
的字符串。注意隐式类的定义及其作用:
implicit class JsonHelper(private val sc: StringContext) extends AnyVal {
def json(args: Any*): JSONObject = ...
}
[您会看到此类正在做的只是向StringContext
添加新行为。由于StringContext
是用于创建特殊字符串插值的机制,例如在s
(简单字符串插值器)中所见,因此此类仅添加了自己的称为json
的插值器。
在用法中,val x: JSONObject = json"{ a: $a }"
,scala搜索json
插值器并在JsonHelper
中找到定义,因为JsonHelper
已通过隐式定义将此行为添加到了StringContext
中。
编译器在"{ a: $a }"
中找到要内插的部分(将是$a
),并将字符串except