2013-11-15 38 views
0

我已经从服务器接收到的数据匹配模式的困难:不能做模式匹配正确

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") 
} 

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

+3

可能只是使用适当的数据结构和理解而不是这个大泥球? – Leo

+0

@Mef,它不是我可以选择的数据结构。它来自服务器。 –

+0

适用于我,可能你在比赛中使用了错误的REPL变量 –

回答

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") 
    } 
}