如何压制"匹配并非详尽无遗!"以下Scala代码中的警告?
val l = "1" :: "2" :: Nil
l.sliding(2).foreach{case List(a,b) => }
到目前为止,我找到的唯一解决方案是使用其他匹配语句包围模式匹配:
l.sliding(2).foreach{x => (x: @unchecked) match {case List(a,b) => }}
然而,这会使代码变得不必要地复杂且难以理解。所以必须有一个更短,更可读的替代方案。有人知道吗?
我忘了提到我的列表l
在我的程序中至少有2个元素。这就是为什么我可以安全地压制警告的原因。
答案 0 :(得分:21)
以下是几个选项:
您可以匹配Seq
而不是List
,因为Seq
没有详尽无遗的检查(这将失败,就像您原来的,在一个元素列表上) :
l.sliding(2).foreach{case Seq(a, b) => ... }
你可以使用for comprehension,它会默默地丢弃任何不匹配的东西(所以它在一个元素列表上什么都不做):
for (List(a, b) <- l.sliding(2)) { ... }
您可以使用collect
,它也会默默地丢弃任何不匹配的内容(以及您将获得迭代器的位置,如果需要,您必须迭代它) :
l.sliding(2).collect{case List(a,b) => }.toList
答案 1 :(得分:20)
使用; case _ => ???
完成它非常简短。 ???
只会引发异常。如果您使用的是2.9或之前(2.10中是新的),您可以定义自己的。
与匹配注释所需的相比,它确实很短:
(: @unchecked)
; case _ => ???
^ One more character!
它不会抛出MatchError
,但这真的很重要吗?
答案 2 :(得分:3)
由于您的sliding(2)
可能会返回最后一个列表,其中只包含一个元素,因此您还应该对其进行测试:
l sliding(2) foreach {
case a::b::Nil => println("two elements: " + a + b)
case l => println("one last element" + l.head)
}
答案 3 :(得分:1)
implicit class RichAny[A](private val a: A) extends AnyVal {
@inline
def match_ignoring_nonexhaustive[B](f: PartialFunction[A,B]): B = f(a)
}
有了这个,您可以执行以下操作,实际上只将案例匹配解释为PartialFunction:
l.sliding(2).foreach{ _ match_ignoring_nonexhaustive {case List(a,b) => }}