Проверить None в Scala Тип параметра isEmpty method
Я использую метод Option type isEmpty
, чтобы проверить, нет ли значения. Я не хочу использовать case
match
, как в моей ситуации, я просто хочу проверить, есть ли None
, поскольку я бы выбрал ошибку для вызывающего. Но метод isEmpty
выходит из строя, даже если значение None
.
Вот что я пробовал!
val questionOption = Question.getQuestionForQuestionId(userExam.get.examId, currQuesId + 1)
if(questionOption.isEmpty) {
Left(Failure(FailureCode.NO_DATA_FOUND, "Cannot get next exam question you tampered your cookie or cookie is lost.... >> TODO... modify the exception message"))
}
Он не попадает в условие if. Я попытался сделать println на вопросеOption, и он печатает None. Так интересно, почему я не попадаю в условие if.
Ответы
Ответ 1
Из комментария к вопросу возникает реальная проблема:
val questionOption = Question.getQuestionForQuestionId(userExam.get.examId, currQuesId + 1)
if(questionOption.isEmpty) {
Left(Failure(FailureCode.NO_DATA_FOUND, "Cannot get next exam question you tampered your cookie or cookie is lost.... >> TODO... modify the exception message"))
}
Сам по себе if
возвращает тип Unit
, так что ваше утверждение ничего не возвращает. Если вы хотите что-то вернуть, вам нужно добавить либо else
, который затем возвращает наименьшую верхнюю границу типов результатов. Следовательно
>>> val yo = if(1 != 0) 4
yo: Unit
>>> val ya = if(1 != 0) Left(1) else Right("got it")
ya: Either[Int, String]
Ответ 2
Вы можете просто выполнить логическую проверку, чтобы увидеть значение "Нет", и выбросить ошибку вызывающему, если она есть, в противном случае продолжить обработку:
scala> val o: Option[Any] = None
o: Option[Any] = None
scala> println(o == None)
true
scala> println(o != None)
false
Но, возможно, лучший способ выполнить то, что вы пытаетесь сделать, предупредить вызывающего абонента об ошибке или продолжить обработку, - это использовать Scala Try idiom для обработки ошибок.