繁体   English   中英

如何避免Option.get和模式匹配始终为Some的Option上的None?

How to avoid Option.get and pattern match on None for Option that is always Some?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有这段(元)代码可以处理我要更新T的数据库对象。

只有已知的东西是此类对象的ID ,检索该对象的query以及要执行的update

def updateObject(...) : Either[(Int,String),(Int,T)] = {

    T.update(
      query,
      update,
    ) match {

    case 0 => Left(404, "No such object!")
    case _ =>
        T.findOne("id == objectId")
        .map((200, _)) match {
          case Some(result) => Right(result)
          case _ => ???
        }

  }

}

T.update对满足query对象执行更新,并返回写结果,该结果是整数(受更新影响的记录数)。

返回类型为Either[(Int,String),(Int,T)]

  • Left的含义是具有以下格式的元组:(error_code,error_message)。
  • Right的格式改为:(状态代码,更新对象)。

如果受影响的记录数为0,则该对象不存在,因此我返回Left(404,"No such object")

如果对象已更新,则需要获取它(因为我只有其ID),将其映射到(Int,T) ,然后在Right返回它。

这是问题

T.findOne返回Option[T]

我已经对对象执行了更新,因此它存在并且结果将始终为Some(T)

我知道这种case _ => ??? 永远不会被调用,但是如果我不加注意的话,编译器会警告我匹配不详尽。

是否有更好的方法来处理此问题(始终将Option保证为Some )?

(我想避免使用Option.get方法),以及case _ => ??? 似乎是不必要且令人困惑的代码。

2 个回复

第一个为什么不是Option.get,如果您100%确信会有结果。 第二个Option.getOrElse还将涵盖极端情况,在这种情况下,更新的对象在您无法检索之前就消失了。

这样的事情怎么样:

    T.findOne("id == objectId").map(Right(200,_._2)).getOrElse(Left(404,"Insane Corner Case : Updated Object not found"))

我决定考虑“极端”案件。

代码已重构为:

T
.findOne("id == objectId")
.map((200, _))
.toRight(404, "Object has been deleted")

感谢mz的提示。

1 为什么会有Option.get方法

为什么该方法get的定义Option ,而不是在Some ? 人们可以适用模式匹配或使用foreach , map , flatMap , getOrElse这无论如何是不优先运行时异常的危险,如果None.get被调用。 真的在某些情况下, get方法非常有说服力吗? 使用get ...

3 Scala中的option [Any]模式匹配

我编写了以下代码来查找与键对应的值并将其返回为Double。 case Some(int)和case Some(i: Int)什么区别? 我是否需要同时使用case Some(int)和case Some(i: Int)来检查类型int? ...

5 Scala模式匹配与Option [Any]的混淆

我有以下Scala代码。 在做Test.test ,我得到了输出: 我期待着输出 解释是什么? 作为第二个问题,我通过以上方式获得unchecked警告: 我该如何避免警告? 编辑:感谢您的建议。 Daniel的想法很好,但似乎不适用于泛型类型,如下 ...

6 使用 Option[Type] 的 Scala 模式匹配

我现在正在玩 Scala 和模式匹配。 我有它背后的一般想法,可以让基础工作。 我的问题是 Option[]。 可以在 Option[] 上使用模式匹配吗? 我想要做的是创建一个小函数,它将接受一个 option[String] 参数,然后根据输入返回字符串,如果它是一个字符串,如果不是,则返回一 ...

7 在Option.isEmpty和Option.get上使用Option.map有什么好处?

我是来自Java背景的Scala新手,目前对考虑Option[T]的最佳实践感到困惑。 我觉得使用Option.map更实用,更美观,但这并不是说服其他人的好理由。 有时,isEmpty检查感觉更直接,因此更具可读性。 有客观上的优势,还是个人偏好? 例: 变化1: ...

2016-08-12 10:02:32 3 424   scala
8 为什么使用 Option.get 会出现编译错误

我想过滤掉未在序列中定义的选项并创建没有选项的序列(具有实际值)。 我正在尝试在 scala 中编译以下代码: idOptionalLibId 是元组的序列。 但它给了我以下错误: 有人遇到过类似的问题吗? ...

2020-05-26 07:49:01 2 100   scala
9 Apache Spark:处理RDD中的Option / Some / None

我正在映射HBase表,每个HBase行生成一个RDD元素。 但是,有时行有坏数据(在解析代码中抛出NullPointerException),在这种情况下我只想跳过它。 我有我的初始映射器返回一个Option ,表示它返回0或1个元素,然后筛选Some ,然后获取包含的值: 有 ...

10 比较Option [T]的实例,避免None == None

昨天我突然明白了,并了解人们如何以及为什么人们使用'map'方法和Option来比较值。 是的,我有点慢,抱歉:) 我修改了这些非常好的链接,并提出了我想问的问题。 http://twitter.github.com/effectivescala http://blog.tm ...

2013-01-28 18:58:22 4 10210   scala
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM