首页 > 解决方案 > Seq[Seq[T]] 没有模式匹配

问题描述

def example1(sss:Seq[Seq[String]]) = sss match {
  case Seq(a, b) :+ Seq(c, d) :+ tail => true
}

val res1 = example1(Seq(Seq("a", "b"), Seq("c","d")))
// scala.MatchError: List(List(a, b), List(c, d)) 

好吧,我有一个解决方法,那就是使用

case Seq(Seq(a, b), Seq(c, d), _*) => true

谁能解释为什么第一个不起作用?

标签: scalapattern-matchingseqextractor

解决方案


您使用了错误的提取器!:+意味着第一部分是(外部)Seq 的一部分,因此ab是类型Seq[String]而不是String,而第二部分Seq(c,d)tail被视为元素,因此cd实际上是String

通常这不会进行类型检查,但在元素类型为 a 的情况下Seq,它会进行检查。但是,如果您假设aand bareString并尝试将它们视为此类,则类型检查器可能会抱怨,从而导致更多混乱。

正确的提取器是+:. 冒号位于序列的一侧,加号位于元素的一侧。因此

  case Seq(a, b) +: Seq(c, d) +: tail => true

符合预期。


推荐阅读