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