【问题标题】:Check for None in Scala Option type isEmpty method在 Scala 选项类型 isEmpty 方法中检查 None
【发布时间】:2014-01-17 13:52:17
【问题描述】:

我正在使用选项类型的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 条件。

【问题讨论】:

  • 你能展示一些复制这个问题的代码吗?
  • case object None extends Option[Nothing] { def isEmpty = true; ...}
  • 您可能做错了什么,或者对问题的描述具有误导性。如果您将 None.isEmpty 粘贴到 REPL 中,它将返回 true。
  • “isEmpty 方法失败”是什么意思? isEmpty 为 None 返回 true,与 isDefined 相反:也许你搞糊涂了?
  • 我注意到它进入了 if 条件,但我从 if 条件中返回。该方法的返回类型是 Either。怎么回不去了?我在这里错过了什么吗?

标签: scala scala-option


【解决方案1】:

从问题下的评论中,真正的问题出现了:

 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]

【讨论】:

    【解决方案2】:

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

    scala> val o: Option[Any] = None
    o: Option[Any] = None
    
    scala> println(o == None)
    true
    
    scala> println(o != None)
    false
    

    但也许更好的方法来完成您正在尝试做的事情,提醒调用者错误或继续处理,是使用 Scala 的 Try 成语来处理错误。

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2020-12-11
      相关资源
      最近更新 更多