1

我一直在学习 Scala,并决定使用 json4s 进行 JSON 解析。我决定使用 XPath 语法进行反序列化,并遇到了我以前从未见过的这种奇怪的语法。

val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val JInt(x) = json\"meaningOfLife"

让我困惑的部分就在这里

val JInt(x) = ...

我无法想象那里发生了什么,我什至不知道如何搜索这种语法或它叫什么。谁能帮我吗?Scala 是一种了不起的语言,具有许多我在 C++ 和 Java 等其他语言中不习惯的简洁特性。

编辑

澄清一下,我很困惑,因为x没有定义,但它以某种方式被传递给函数或构造函数,然后被分配给json\"meaningOfLife"返回 a的结果JValue

编辑 2

经过一些研究和玩耍,我发现这与案例类有关。我能够运行以下代码。

case class MyCaseClass (x: Int)
val MyCaseClass(x) = new MyCaseClass(5)
println(x, x.getClass) // prints (5,int)

在查看了一些代码之后,这让我对正在发生的事情有了很好的理解。

val MyCaseClass(x) = MyCaseClass(5)

正在从实例化的Int值中提取(因为没有更好的术语)并将其存储到中,意思是.5MyCaseClassxxInt

在 json4s 的代码中,aJInt是运算JValue\返回的 a。因此,JInt(x)取出 a BigInt(存储在 class 中JInt)并将其放入x我收集的值中。

但我还有一个问题。这个过程叫什么?有没有关于它的文件?

4

1 回答 1

5

它被称为“无可辩驳的模式匹配”,它本质上等同于这段代码:

val json = JsonMethods.parse("""{"meaningOfLife": 42}""")

val x = json match {
  case JInt(xMatched) => xMatched
}

换句话说,任何符合声明左侧模式的案例类或任何提取器都可以以这种方式使用。

附录:

“无可辩驳”意味着MatchError如果不能满足模式,将抛出 a。

于 2013-02-05T02:45:38.240 回答