[英]How to avoid Option.get and pattern match on None for Option that is always Some?
我有這段(元)代碼可以處理我要更新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.