奇怪的案例类语法

Spa*_*ace 1 xpath scala

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

val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val JInt(x) = json\"meaningOfLife"
Run Code Online (Sandbox Code Playgroud)

令我困惑的是这一点

val JInt(x) = ...
Run Code Online (Sandbox Code Playgroud)

我无法理解那里发生的事情,我甚至不知道如何搜索这种语法或者它的名称.谁能帮我吗?Scala是一种令人惊叹的语言,具有许多简洁的功能,我在其他语言(如C++和Java)中不习惯这些功能.

编辑

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

编辑2

经过一些研究和游戏后,我发现这与案例类有关.我能够运行以下代码.

case class MyCaseClass (x: Int)
val MyCaseClass(x) = new MyCaseClass(5)
println(x, x.getClass) // prints (5,int)
Run Code Online (Sandbox Code Playgroud)

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

val MyCaseClass(x) = MyCaseClass(5)
Run Code Online (Sandbox Code Playgroud)

提取(缺少一个更好的术语)来自实例化和存储的Int值,意思是类型.5MyCaseClassxxInt

在用于json4s一个代码JInt是一个JValue其中\操作者的回报.所以JInt(x)它正在取出BigInt(存储在类中JInt)并将其放入x我收集的值中.

但我还有一个问题.这个过程叫什么?有没有任何文件?

Ran*_*ulz 5

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

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

val x = json match {
  case JInt(xMatched) => xMatched
}
Run Code Online (Sandbox Code Playgroud)

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

附录:

"无可辩驳"意味着MatchError如果不能满足模式将抛出a .