Seq[Seq[T]] 没有模式匹配
No pattern match for 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
谁能解释为什么第一个不起作用?
您用错了提取器! :+
意味着第一部分是(外部)Seq 的一部分,因此 a
和 b
的类型是 Seq[String]
而不是 String
,而第二部分Seq(c,d)
和 tail
部分被视为元素,因此 c
和 d
实际上是 String
。
通常这不会进行类型检查,但在元素类型为 Seq
的情况下,它会进行类型检查。但是,如果您假设 a
和 b
是 String
,并尝试这样对待它们,类型检查器可能会抱怨,导致更多混乱。
正确的提取器是 +:
。冒号在序列的一侧,加号在元素的一侧。因此
case Seq(a, b) +: Seq(c, d) +: tail => true
符合预期。
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
谁能解释为什么第一个不起作用?
您用错了提取器! :+
意味着第一部分是(外部)Seq 的一部分,因此 a
和 b
的类型是 Seq[String]
而不是 String
,而第二部分Seq(c,d)
和 tail
部分被视为元素,因此 c
和 d
实际上是 String
。
通常这不会进行类型检查,但在元素类型为 Seq
的情况下,它会进行类型检查。但是,如果您假设 a
和 b
是 String
,并尝试这样对待它们,类型检查器可能会抱怨,导致更多混乱。
正确的提取器是 +:
。冒号在序列的一侧,加号在元素的一侧。因此
case Seq(a, b) +: Seq(c, d) +: tail => true
符合预期。