我一直在学习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我收集的值中.
但我还有一个问题.这个过程叫什么?有没有任何文件?
它被称为"无可辩驳的模式匹配",它基本上等同于这段代码:
val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val x = json match {
case JInt(xMatched) => xMatched
}
Run Code Online (Sandbox Code Playgroud)
换句话说,任何适合声明左侧模式的案例类或任何提取器都可以这种方式使用.
附录:
"无可辩驳"意味着MatchError如果不能满足模式将抛出a .
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |