Skip to main content
 首页 » 编程设计

scala之奇怪的案例类语法

2025年05月04日116mfrbuaa

我一直在学习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中。

但是我还有一个问题。这个过程叫什么?是否有任何文档?

请您参考如下方法:

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

val json = JsonMethods.parse("""{"meaningOfLife": 42}""") 
 
val x = json match { 
  case JInt(xMatched) => xMatched 
} 


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

附录:

“不可辩驳的”表示如果无法满足该模式,则会抛出 MatchError