25

我正在使用选项类型的isEmpty方法来检查是否没有值。我不想case match在我的情况下使用 as,我只想检查是否有Noneas 我会向调用者抛出错误。但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 条件。我试图在 questionOption 上做一个 println,它打印了 None。所以想知道为什么我没有进入 if 条件。

4

2 回答 2

24

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

 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]
于 2013-12-30T17:16:54.853 回答
14

您可以只进行布尔检查以查看值为 None 并将错误抛出给调用者(如果是),否则继续处理:

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

scala> println(o == None)
true

scala> println(o != None)
false

但也许更好的方式来完成你正在尝试做的事情,提醒错误的调用者或继续处理,将使用 Scala 的Try idiom 来处理错误。

于 2013-12-30T16:38:30.990 回答