web-dev-qa-db-ja.com

ScalaオプションタイプisEmptyメソッドでNoneを確認します

オプションタイプのisEmptyメソッドを使用して、値がないかどうかを確認しています。私の状況のようにcasematchを使用したくありません。呼び出し元にエラーをスローするので、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条件の内側に入らないのだろうか。

22
sparkr

質問の下のコメントから、本当の問題が現れます:

 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")) 
 }

それ自体では、ifUnit型を返すため、ステートメントは何も有用なものを返しません。何かを返したい場合は、elseを追加する必要があります。これは結果の型の最小の上限を返します。したがって

 >>> val yo = if(1 != 0) 4
 yo: Unit

 >>> val ya = if(1 != 0) Left(1) else Right("got it")
 ya: Either[Int, String]
23
wheaties

ブール値のチェックを行って値がNoneであるかどうかを確認し、エラーがある場合は呼び出し元にエラーをスローします。そうでない場合は処理を続行します。

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

scala> println(o == None)
true

scala> println(o != None)
false

しかし、多分あなたがしようとしていることを達成し、呼び出し元にエラーを警告するか、処理を継続するより良い方法は、Scalaの Try イディオムを使用してエラーを処理することです。

10
axiopisty