Проверить 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 для обработки ошибок.