如何压制“匹配并不详尽!” Scala中的警告

时间:2012-11-05 10:12:09

标签: scala pattern-matching

如何压制"匹配并非详尽无遗!"以下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个元素。这就是为什么我可以安全地压制警告的原因。

4 个答案:

答案 0 :(得分:21)

以下是几个选项:

  1. 您可以匹配Seq而不是List,因为Seq没有详尽无遗的检查(这将失败,就像您原来的,在一个元素列表上) :

    l.sliding(2).foreach{case Seq(a, b) => ... }
    
  2. 你可以使用for comprehension,它会默默地丢弃任何不匹配的东西(所以它在一个元素列表上什么都不做):

    for (List(a, b) <- l.sliding(2)) { ... }
    
  3. 您可以使用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) => }}