【发布时间】:2012-06-26 07:31:22
【问题描述】:
我正在尝试将来自 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))
动态构建响应更容易。
所以...
我可以通过以下方式编译它(带有弃用警告):
case class OK(override val body: Body) extends Response(200, body)
但是,这似乎不适用于模式匹配。
Response(200, Body("application/json", "")) match {
case OK(_) => ":-)"
case _ => ":-("
}
res0: java.lang.String = :-(
关于这如何工作的任何想法?我对不同的方法持开放态度,但这是我为案例类寻找实际用途的尝试
【问题讨论】:
标签: scala pattern-matching case-class extractor