Próbuję modelować odpowiedzi z interfejsów REST API jako klasy przypadków, w których mogę używać dopasowywania wzorców.Modelowanie z klasą obudowy Scala
Pomyślałem, że dobrze byłoby założyć dziedziczenie, ale widzę, że jest to przestarzałe. Wiem, że istnieją już pytania dotyczące klas przypadków i dziedziczenia, ale moje pytanie jest bardziej o tym, jak można modelować następujące "właściwą drogę" tutaj bez dziedziczenia.
zacząłem z dwóch następujących klasach przypadków, które działają dobrze:
case class Body(contentType: String, content: String)
case class Response(statusCode: Int, body: Body)
czyli rozmowy reszta będzie powrócić z czymś takim:
Response(200, Body("application/json", """{ "foo": "bar" }"""))
które mogłem wzór mecz jak:
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")
}
itp. Co działa dobrze.
Gdzie wpadłem w kłopoty to: Chciałbym rozszerzenia pomocnicze dla tych klas sprawy, takich jak:
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)
tak, że mogę nie uproszczony wzór pasuje tak:
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")
}
a także, który umożliwiłby również mój kod REST do bezpośredniego użycia i zwrotu:
Response(code, Body(contentType, content))
która jest e aby dynamicznie budować odpowiedź.
tak ...
mogę go skompilować (z ostrzeżeniami amortyzację) poprzez:
case class OK(override val body: Body) extends Response(200, body)
Jednak to nie wydają się działać z dopasowywania wzorca.
Response(200, Body("application/json", "")) match {
case OK(_) => ":-)"
case _ => ":-("
}
res0: java.lang.String = :-(
Wszelkie pomysły na to, jak to może działać? Jestem otwarty na różne podejścia, ale to była moja próba znalezienia praktycznego zastosowania dla klas przypadków
Ach, dziękuję - widzę, że całkowicie straciłem cel, by nie stosować się do tego; To jest bardzo pomocne. Przetestuję to w pełni z moim kodem, aby upewnić się, że omówiłem i zaakceptuję później wieczorem. – 7zark7
Dobra odpowiedź @ Siss. Własne ekstraktory to jedna z rzeczy, które bardzo lubię w Scali. – mergeconflict
@ 7zark7 Zwróć uwagę, że podczas korzystania z niestandardowych ekstraktorów tracisz gwarancje szczelności zamkniętych klas. –