Scala 3中Vector模式匹配报非穷举警告,Seq正常的问题咨询
Scala 3.4.2中Vector模式匹配的非穷举警告问题
在Scala 3.4.2中执行以下代码:
Vector(1, 2, 3) match case Vector() => println("empty") case _ :+ last => println(s"last: $last")
编译器会触发非穷举匹配警告:
[warn] -- [E029] Pattern Match Exhaustivity Warning: ... [warn] 5 | Vector(1, 2, 3) match [warn] | ^^^^^^^^^^^^^^^ [warn] |match may not be exhaustive. [warn] | [warn] |It would fail on pattern case: Vector(_, _*), Vector(_, _*), Vector(_, _*), Vector(_, _*), Vector(_, _*), Vector(_, _*)
但将代码中的Vector替换为Seq时,编译可以正常通过,无任何警告。该问题与Scala 2中编号为12240的已知bug类似,也关联到标记为“Scala 3中已修复”的编号12252的bug。
问题解答
这是Scala 3的真实bug。
Vector()能匹配所有空Vector实例,_ :+ last是序列后缀模式,理论上可以覆盖所有非空Vector的情况,两者结合应该是完全穷举的。编译器给出的警告不符合实际逻辑,而Seq的正常编译结果也验证了这是Vector特定的模式匹配检查逻辑缺陷。该问题与已有的SI-12240、SI-12252 bug高度相关。尽管SI-12252标记为已修复,但显然Vector场景下的修复并不彻底。建议先在Scala官方的bug追踪仓库搜索现有工单,可使用关键词"Vector match exhaustivity :+"或关联上述两个bug编号。如果未找到完全匹配的记录,再提交新的bug工单,需附上你的测试代码、Scala版本、完整的警告信息,以及Seq正常编译的对比情况。
内容的提问来源于stack exchange,提问作者Georg
相关产品推荐
相关产品推荐

