【发布时间】:2014-10-13 12:45:50
【问题描述】:
在网络上所有这样的 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 countReq@CountRequestParams() => System.out.println("count req=" + countReq)
case _ => System.out.println("match nothing")
}
}
然而,这不会编译抱怨 Map[String, String] 是必需的。我有 unapply 采用该参数的方法,如此处所示
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))
}
}
编译器不喜欢我的代码是不是我做错了什么?
接下来,是否有一种干净的方法来验证并转换为布尔值、整数等...因为目前我的对象都是 Option[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 和 maxResults 中的一个 Int 等)
谢谢, 院长
【问题讨论】:
标签: scala scala-2.10