无法正确进行模式匹配

时间:2013-11-15 15:46:06

标签: scala

我在从服务器接收数据的模式匹配方面遇到困难:

scala> res
res9:Option[List[Any]] = Some(List(Some(List(Some(1))), Some(List(Some(2))), Some(List(Some(3))), Some(List(Some(4)))))

scala> res match {
     |   case x:Option[List[Any]] => println("yes")
     |   case _ => println("no")
     | }

yes

是的,没有错误,但我真正想做的是:

res match {
  case Some(List(
    Some(List(Some(a: Int))),
    Some(List(Some(b: Int))),
    Some(List(Some(c: Int))),
    Some(List(Some(d: Int)))
  )) => println(s"yessss, a: $a; b: $b; c: $c; d: $d")

  case _ => println("no")
}

出于某种原因,这里说“不”。

1 个答案:

答案 0 :(得分:0)

您可以通过定义与您正在使用的数据相对应的extractor object来简化您的生活:

object Test extends App {
  object My {
    def unapply(x: Any): Option[Int] =
      x match {
        case Some(List(Some(a: Int)))   => Some(a)
        case _                          => None
      }
  }

现在可以大大缩短与您的示例匹配的内容:

  val res : Option[List[Any]] = Some(List(Some(List(Some(1))),
                                          Some(List(Some(2))),
                                          Some(List(Some(3))),
                                          Some(List(Some(4)))))

  res match {
    case Some(List(My(a), My(b), My(c), My(d))) =>
       println(s"yessss, a: $a; b: $b; c: $c; d: $d")

    case _ => println("no")
  }
}