我一直在学习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
中提取5
值MyCaseClass
并将其存储到x
,意味着x
将属于Int
类型。
在json4s的代码中,JInt
是JValue
运算符返回的\
。因此,JInt(x)
正在取出BigInt
(存储在班级JInt
中)并将其放入我收集的值x
中。
但我还有一个问题。这个过程叫什么?有没有关于它的文件?
答案 0 :(得分:5)
它被称为“无可辩驳的模式匹配”,它基本上等同于这段代码:
val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val x = json match {
case JInt(xMatched) => xMatched
}
换句话说,任何适合声明左侧模式的案例类或任何提取器都可以这种方式使用。
附录:
“无可辩驳”意味着如果无法满足模式,则会抛出MatchError
。