为什么该方法get的定义Option ,而不是在Some ? 人们可以适用模式匹配或使用foreach , map , flatMap , getOrElse这无论如何是不优先运行时异常的危险,如果None.get被调用。 真的在某些情况下, get方法非常有说服力吗? 使用get ...
提示:本站收集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)]
:
如果受影响的记录数为0,则该对象不存在,因此我返回Left(404,"No such object")
。
如果对象已更新,则需要获取它(因为我只有其ID),将其映射到(Int,T)
,然后在Right
返回它。
这是问题 :
T.findOne
返回Option[T]
。
我已经对对象执行了更新,因此它存在并且结果将始终为Some(T)
。
我知道这种case _ => ???
永远不会被调用,但是如果我不加注意的话,编译器会警告我匹配不详尽。
是否有更好的方法来处理此问题(始终将Option
保证为Some
)?
(我想避免使用Option.get
方法),以及case _ => ???
似乎是不必要且令人困惑的代码。
第一个为什么不是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的提示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.