【问题标题】:matching in scala map to an object在scala映射中匹配一个对象
【发布时间】: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


    【解决方案1】:

    啊,我没有使用带有 unapply 方法的实体,所以这修复了它

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多