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惯用法来处理错误.