Scala中的自定义字符串插值

问题描述 投票:0回答:2

我想对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以及如何在函数定义中使用它。

有人可以帮我吗。

谢谢!

scala implicit-conversion string-interpolation
2个回答
2
投票

不是转换为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中。


0
投票

编译器在"{ a: $a }"中找到要内插的部分(将是$a),并将字符串except

© www.soinside.com 2019 - 2024. All rights reserved.