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

spa*_*rkr 22 scala scala-option

我正在使用Option Type的isEmpty方法来检查是否没有值.我不想case match在我的情况下使用as,我只是想检查是否有,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"))
} 
Run Code Online (Sandbox Code Playgroud)

它没有进入if条件.我试着在questionOption上做一个println,然后打印出None.所以想知道为什么我没有进入if条件.

whe*_*ies 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")) 
 }
Run Code Online (Sandbox Code Playgroud)

本身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]
Run Code Online (Sandbox Code Playgroud)


axi*_*sty 10

你可以做一个布尔检查,看看值是None,如果是,则将错误抛给调用者,否则继续处理:

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

scala> println(o == None)
true

scala> println(o != None)
false
Run Code Online (Sandbox Code Playgroud)

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