Как я должен обрабатывать предупреждение «совпадение не может быть исчерпывающим» в Scala? - PullRequest
0 голосов
/ 11 декабря 2019

После обновления моего кода до Scala 2.13 с 2.12 я получаю кучу таких предупреждений:

[warn] /mystuff/ScalaJack/core/src/main/scala/co.blocke.scalajack/model/TypeAdapterCache.scala:100:40: match may not be exhaustive.
[warn] It would fail on the following input: Nil
[warn]                     val head :: tail = factories

(фабрики - это список типа T)

Это не такЗаявление о совпадении - это задание. Я согласен с компилятором, что это потерпит неудачу, если на фабриках будет Nil, но как лучше выполнить это назначение?

Ответы [ 3 ]

2 голосов
/ 11 декабря 2019

В этом случае ваша операция не будет выполнена, если введено значение Nil. Если вы знаете, что список не может быть пустым, вы можете использовать тип NonEmptyList для кошек: https://typelevel.org/cats/api/cats/data/NonEmptyList.html. В противном случае вы можете использовать сопоставление с шаблоном, чтобы более четко выразить свое намерение в этом случае, например:

val (head, tail) = factories match {
  case h :: t => (h,t)
  case Nil => ??? //Process empty list however you like
}
0 голосов
/ 12 декабря 2019

В дополнение к объяснению Этана, код может быть изменен, как показано ниже

factories match {
  case head::tail => // your original code
  case Nil => // handle it or leave as _ 
}
0 голосов
/ 11 декабря 2019
val head :: tail = factories

Хотя это не выражение match, оно включает сопоставление с шаблоном factories с шаблоном head::tail, которое может завершиться ошибкой, если factories равно Nil.

Решениебезопасное разбиение списка и последующая обработка возможных ошибок:

val (head, tail) = factories.splitAt(1)

head будет List и, следовательно, потенциально пустым, поэтому протестируйте с помощью isEmpty или конвертируйте в Option, используяheadOption, а затем используйте стандартные Option методы для его обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...