簡體   English   中英

在 rust 中實例化錯誤時出現問題

[英]Problems while instantiating an error in rust

我有一個結構,其中包含返回代碼和從 postgres 查詢中檢索到的數據。 我有一個初始化結構的 new() function:

impl <T> Response <T>
     {
     pub fn new() -> Response <T>
             {
             return Response
                 {
                 rc : RetCode::Ok,
 ------>         pg_err : Error::new(),
                 desc : "".to_string(),
                 data : Vec::new(), 
                 id : 0,
                }

但是 postgres::Error::new() 是私有的。 有沒有辦法創建一個新的錯誤(我不介意類型或內容),只是為了實際的未來錯誤的占位符? 我不需要 Null,只是一個假錯誤,因為在 RetCode 中我有 ok,no-data-retrived,postgre 錯誤,所以我需要在 retcode 為 pg_error 時檢查錯誤。

正如評論中提到的,沒有公開的方法來創建postgres::Error 您只能從其他一些失敗的 postgres 操作中獲得一個。 您可以使用鏈接的答案並使用Option在發生錯誤之前使用None創建pg_err ,並在錯誤發生時使用Some(...)填充它。

但是,這不是您應該解決此特定問題的方式。 您有一個單一類型,旨在表達多個不同的 forms 響應:“ok”、“no-data”和“error”,正如您在評論中提到的那樣。 所以聽起來你的RetCode是這樣設計的:

enum RetCode { Ok, NoData, Error }

但是 Rust enum比其他語言強大得多,它們可以保存特定變體專有的數據。 有一種哲學是“使無效狀態無法代表”。 換句話說,如果沒有發生錯誤,為什么會有pg_err呢? 如果狀態為NoData ,為什么還要有一個data字段?

您可以像這樣重組對象:

enum ResponseKind<T> {
    Ok { data: Vec<T> },
    NoData,
    Error { pg_err: postgres::Error },
}

struct Response<T> {
    id: i32,
    desc: String,
    kind: ResponseKind<T>,
}

這樣您就不必擔心創建一些虛擬錯誤類型。

您應該注意其他評論; 不要陷入僅僅為了它而簡單地創建一個虛擬構造函數的陷阱。 new()只是一個約定,如果您的類型沒有明顯的默認 state,則不應遵循該約定。 您應該具有帶有參數的構造函數,這些參數提供有效數據來構造它。 喜歡:

impl<T> Response<T> {
    pub fn ok(id: i32, desc: String, data: Vec<T>) -> Response<T> {
        // or maybe id and desc are generated or dependent on
        // kind and don't need to be parameters?
        Response {
            id,
            desc,
            kind: ResponseKind::Ok { data },
        }
    }

    pub fn no_data(id: i32, desc: String) -> Response<T> { ... }
    pub fn error(id: i32, desc: String, error: Error) -> Response<T> { ... }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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