奇怪的案例类语法

时间:2013-02-05 00:13:47

标签: scala xpath

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

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

让我感到困惑的是这一点

val JInt(x) = ...

我无法理解那里发生的事情,我甚至不知道如何搜索这种语法或者它的名称。谁能帮我吗? 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)

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

val MyCaseClass(x) = MyCaseClass(5)

从实例化的Int中提取5MyCaseClass并将其存储到x,意味着x将属于Int类型。

在json4s的代码中,JIntJValue运算符返回的\。因此,JInt(x)正在取出BigInt(存储在班级JInt中)并将其放入我收集的值x中。

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

附录:

“无可辩驳”意味着如果无法满足模式,则会抛出MatchError