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