Во всех примерах SCALA в Интернете, как это одинсоответствие в карте лестницы объекта
http://www.artima.com/pins1ed/case-classes-and-pattern-matching.html
там всегда кажется суперкласс. Есть ли способ избежать необходимости в суперклассе или это необходимо. Например, я могу сделать что-то вроде этого ..
def matchMe(map: Map[String, String]) {
map match {
case searchReq @ SearchQueryRequestParams() => System.out.println("something=" + query)
//case [email protected]() => System.out.println("count req=" + countReq)
case _ => System.out.println("match nothing")
}
}
Это, однако, не компилируется жалуется, что карта [String, String] требуется. У меня есть методы, исключить его принимать этот параметр, как показано здесь
trait SearchValidatorBase {
def unapply(params: Map[String, String]): Option[CommonQueryRequestParams] = {
val query = params.get("query")
val fromDateStr = params.get("fromDate")
val toDateStr = params.get("toDate")
Some(CommonQueryRequestParams(query, fromDateStr, toDateStr))
}
}
object CountMatching extends SearchValidatorBase {
override def unapply(params: Map[String, String]): Option[CountRequestParams] = {
val result = super.unapply(params)
val commonParams = result.getOrElse(throw new RuntimeException("bug, should always have a CommonQueryRequestParams"))
val bucket = params.get("bucket")
Some(CountRequestParams(commonParams, bucket))
}
}
object SearchMatching extends SearchValidatorBase {
override def unapply(params: Map[String, String]): Option[SearchQueryRequestParams] = {
val result = super.unapply(params)
val commonParams = result.getOrElse(throw new RuntimeException("bug, should always have a CommonQueryRequestParams"))
val maxResults = params.get("maxResults")
val nextToken = params.get("nextToken")
Some(SearchQueryRequestParams(commonParams, maxResults, nextToken))
}
}
я делаю что-то неправильно, как компилятор не нравится мой код?
Далее, есть чистый способ, чтобы проверить и перевести в логическое значение, Ints, и т.д. ... в настоящее время мои объекты все опции [String], как в следующем
case class CommonQueryRequestParams(
originalQuery: Option[String],
fromDate: Option[String],
toDate: Option[String]
)
case class SearchQueryRequestParams(
commonRequest: CommonQueryRequestParams,
maxResults: Option[String],
nextToken: Option[String])
case class CountRequestParams(commonRequest: CommonQueryRequestParams, bucket: Option[String])
В идеале, я хочу вернуть чистые ошибки обратно пользователю, как FromDate недействителен (я хочу DateTime там на самом деле и Int в maxResults и т.д. и т.п.)
спасибо, Дин