我试图将来自REST API的响应建模为案例类,我可以使用模式匹配。斯卡拉案例类建模
我认为这将是一个很好的假设继承,但我发现这已被弃用。 我知道已经有关于案例类和继承的问题,但是我的问题更多地是关于如何在这里继承而不是继承。
我开始用下面的两个案例类,做工精细:
case class Body(contentType: String, content: String)
case class Response(statusCode: Int, body: Body)
即一个REST调用将喜欢的东西返回:
Response(200, Body("application/json", """{ "foo": "bar" }"""))
,我可以的模式匹配,如:
response match {
case Response(200, Body("application/json", json)) => println(json)
case Response(200, Body("text/xml", xml)) => println(xml)
case Response(_,_) => println("Something unexpected")
}
等工作正常。
我在哪里遇到了麻烦是:我想这些情况下类的辅助扩展,如:
case class OK(body: Body) extends Response(200, body)
case class NotFound() extends Response(404, Body("text/plain", "Not Found"))
case class JSON(json: String) extends Body("application/json", json)
case class XML(xml: String) extends Body("text/xml", xml)
,这样我可以做简单的图案像这样的比赛:
response match {
case OK(JSON(json)) => println(json)
case OK(XML(xml)) => println(xml)
case NotFound() => println("Something is not there")
// And still drop down to this if necessary:
case Response(302, _) => println("It moved")
}
也可以让我的REST代码直接使用并返回:
Response(code, Body(contentType, content))
这是e asier动态地构建响应。
case class OK(override val body: Body) extends Response(200, body)
然而,这似乎并没有与模式匹配的工作:
通过所以......
我可以得到它来编译(用废弃警告)。
Response(200, Body("application/json", "")) match {
case OK(_) => ":-)"
case _ => ":-("
}
res0: java.lang.String = :-(
有关如何工作的任何想法?我接受不同的方法,但这是我尝试寻找案例类别的实际用途
啊,谢谢 - 我看到我完全错过了直到此为止的无用的目的;这非常有帮助。将我的代码完全测试出来,以确保我已经覆盖并且将在今晚晚些时候接受。 – 7zark7
好答案@Sciss。自定义提取器是我对Scala很喜欢的一件事。 – mergeconflict
@ 7zark7请注意,当您使用自定义提取器时,您将失去密封类的详尽性保证。 –