How to suppress “match is not exhaustive!” warning in Scala

前端 未结 4 2031
我在风中等你
我在风中等你 2020-12-11 00:09

How can I suppress the \"match is not exhaustive!\" warning in the following Scala code?

val l = \"1\" :: \"2\" :: Nil
l.sliding(2).foreach{case List(a,b) =&         


        
相关标签:
4条回答
  • 2020-12-11 00:52
    implicit class RichAny[A](private val a: A) extends AnyVal {
      @inline
      def match_ignoring_nonexhaustive[B](f: PartialFunction[A,B]): B = f(a)
    }
    

    With this you could do the following, which actually only interprets the case match as PartialFunction:

    l.sliding(2).foreach{ _ match_ignoring_nonexhaustive {case List(a,b) => }}
    
    0 讨论(0)
  • 2020-12-11 00:55

    Since your sliding(2) can possibly return one last list with only one element in it, you should also test it:

    l sliding(2) foreach {
      case a::b::Nil => println("two elements: " + a + b)
      case l         => println("one last element" + l.head)
    }
    
    0 讨论(0)
  • 2020-12-11 01:10

    Here are several options:

    1. You can match against Seq instead of List, since Seq doesn't have the exhaustiveness checking (this will fail, like your original, on one element lists):

      l.sliding(2).foreach{case Seq(a, b) => ... }
      
    2. You can use a for comprehension, which will silently discard anything that doesn't match (so it will do nothing on one element lists):

      for (List(a, b) <- l.sliding(2)) { ... }
      
    3. You can use collect, which will also silently discard anything that doesn't match (and where you'll get an iterator back, which you'll have to iterate through if you need to):

      l.sliding(2).collect{case List(a,b) => }.toList
      
    0 讨论(0)
  • 2020-12-11 01:12

    Making it complete with ; case _ => ??? is pretty short. ??? just throws an exception. You can define your own if you're using 2.9 or before (it's new in 2.10).

    It really is pretty short compared to what you need for a match annotation:

    (: @unchecked)
    ; case _ => ???
                  ^  One more character!
    

    It doesn't throw a MatchError, but does that really matter?

    0 讨论(0)
提交回复
热议问题