如何避免选项上的Option.get和模式匹配,总是有些?

时间:2015-01-14 18:56:44

标签: scala functional-programming pattern-matching

我有一些(meta)代码处理我想要更新的数据库对象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)。
  • 右边的格式是这样的:(status_code,updated_object)。

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

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

以下是问题

T.findOne返回Option[T]

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

我知道case _ => ???将永远不会被调用,但如果我不把它放进去,编译器会警告我这场比赛并非详尽无遗。

有没有更好的方法来解决此问题(Option总是保证Some)?

(我试图避免Option.get方法),而case _ => ???似乎是不必要且令人困惑的代码。

2 个答案:

答案 0 :(得分:1)

为什么不选择Option.get,如果你100%确定会有结果。 第二个Option.getOrElse还将介绍在您能够检索更新对象之前消失的极端边缘情况。

这样的事情怎么样:

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

答案 1 :(得分:1)

我决定考虑"极端"情况下。

代码已经重构为:

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

感谢 m-z 提示。