web-dev-qa-db-fra.com

Vérifiez Aucun dans Scala Type d'option isEmpty method

J'utilise la méthode isEmpty du type d'option pour vérifier s'il n'y a pas de valeur. Je ne veux pas utiliser le casematch comme dans ma situation, je veux juste vérifier s'il y a None car je lancerais une erreur à l'appelant. Mais la méthode isEmpty échoue même si la valeur est None.

Voici ce que j'ai essayé!

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

Il n'entre pas dans la condition if. J'ai essayé de faire un println sur la questionOption et il n'imprime aucun. Je me demande donc pourquoi je n'entre pas dans la condition if.

22
sparkr

Du commentaire sous la question, le vrai problème émerge:

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

En soi, if renvoie le type Unit de sorte que votre instruction ne retourne rien d'utile. Si vous souhaitez renvoyer quelque chose, vous devez ajouter un else qui renvoie ensuite la borne supérieure la moins élevée des types de résultats. Par conséquent

 >>> 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

Vous pouvez simplement faire une vérification booléenne pour voir que la valeur est None et renvoyer l'erreur à l'appelant si c'est le cas, sinon continuer le traitement:

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

scala> println(o == None)
true

scala> println(o != None)
false

Mais peut-être qu'une meilleure façon d'accomplir ce que vous essayez de faire, d'alerter l'appelant de l'erreur ou de poursuivre le traitement, serait d'utiliser l'idiome Try de Scala pour gérer les erreurs.

10
axiopisty