Подтвердить что ты не робот

Как подавить "матч не исчерпывающий!" предупреждение в Scala

Как я могу подавить "матч не исчерпывающий!" предупреждение в следующем 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 элемента в моей программе. Вот почему я могу безопасно подавить предупреждение.

4b9b3361

Ответ 1

Вот несколько вариантов:

  • Вы можете сопоставлять с Seq вместо List, так как Seq не имеет проверки исчерпывающей информации (это приведет к сбою, как и ваш оригинал, в списках элементов):

    l.sliding(2).foreach{case Seq(a, b) => ... }
    
  • Вы можете использовать для понимания, который будет молча отбрасывать все, что не соответствует (поэтому он не будет ничего делать в списках элементов):

    for (List(a, b) <- l.sliding(2)) { ... }
    
  • Вы можете использовать collect, который также будет молча отбрасывать все, что не соответствует (и где вы получите обратно итератор, который вам нужно будет перебирать, если вам нужно):

    l.sliding(2).collect{case List(a,b) => }.toList
    

Ответ 2

Завершение работы с ; case _ => ??? довольно короткое. ??? просто генерирует исключение. Вы можете определить свой собственный, если используете 2.9 или раньше (это новое в 2.10).

Это очень мало по сравнению с тем, что вам нужно для аннотации соответствия:

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

Он не бросает MatchError, но действительно ли это имеет значение?

Ответ 3

Поскольку ваш sliding(2) может возвращать один последний список только с одним элементом в нем, вы также должны его протестировать:

l sliding(2) foreach {
  case a::b::Nil => println("two elements: " + a + b)
  case l         => println("one last element" + l.head)
}

Ответ 4

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) => }}