簡體   English   中英

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

[英]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)]

  • 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 _ => ??? 似乎是不必要且令人困惑的代碼。

第一個為什么不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM