在Scala选项类型isEmpty方法中检查无

时间:2013-12-30 16:35:20

标签: scala scala-option

我正在使用Option Type的isEmpty方法来检查是否没有值。我不想在我的情况下使用case match,我只想检查是否有None,因为我会向调用者抛出错误。但即使值为isEmptyNone方法也会失败。

这是我试过的!

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条件。我试着在questionOption上做一个println,然后打印出None。所以想知道为什么我没有进入if条件。

2 个答案:

答案 0 :(得分:23)

从问题的评论中,出现了真正的问题:

 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]

答案 1 :(得分:10)

您可以执行布尔检查以查看值为None并将错误抛给调用者,否则继续处理:

scala> val o: Option[Any] = None
o: Option[Any] = None

scala> println(o == None)
true

scala> println(o != None)
false

但也许更好的方法来完成你要做的事情,提醒调用者错误或继续处理,将使用Scala的Try成语来处理错误。