オプションタイプの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条件の内側には入りません。 questionOptionでprintlnを実行しようとすると、Noneが出力されます。だから、なぜif条件の内側に入らないのだろうか。
質問の下のコメントから、本当の問題が現れます:
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]
ブール値のチェックを行って値がNoneであるかどうかを確認し、エラーがある場合は呼び出し元にエラーをスローします。そうでない場合は処理を続行します。
scala> val o: Option[Any] = None
o: Option[Any] = None
scala> println(o == None)
true
scala> println(o != None)
false
しかし、多分あなたがしようとしていることを達成し、呼び出し元にエラーを警告するか、処理を継続するより良い方法は、Scalaの Try イディオムを使用してエラーを処理することです。