我試圖將來自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請注意,當您使用自定義提取器時,您將失去密封類的詳盡性保證。 –