2014-10-13 4 views
0

Во всех примерах 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 и т.д. и т.п.)

спасибо, Дин

ответ

0

ах, я не использовал примитивы с методами unapply, поэтому это исправляет его

def matchMe(map: Map[String, String]) { 
    map match { 
    case searchReq @ SearchMatching() => System.out.println("something=" + searchReq) 
    //case [email protected]() => System.out.println("count req=" + countReq) 
    case _ => System.out.println("match nothing") 
    } 
}