Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reference 如何正确地实现Error::cause?_Reference_Rust_Option_Traits - Fatal编程技术网

Reference 如何正确地实现Error::cause?

Reference 如何正确地实现Error::cause?,reference,rust,option,traits,Reference,Rust,Option,Traits,我在实现错误特性时遇到问题。我想包装来自Diesel或其他数据库驱动程序的错误。我甚至没有接近从实现,因为我在实现错误方面已经失败了。导致代码不编译的那一行是位于代码块末尾的那一行 use std::fmt; use std::error::{self, Error}; #[derive(Debug)] pub enum MyError { NotFound(String), PersistenceError(Box<Error + Send + Sync>), }

我在实现
错误
特性时遇到问题。我想包装来自Diesel或其他数据库驱动程序的错误。我甚至没有接近从实现
,因为我在实现
错误
方面已经失败了。导致代码不编译的那一行是位于代码块末尾的那一行

use std::fmt;
use std::error::{self, Error};

#[derive(Debug)]
pub enum MyError {
    NotFound(String),
    PersistenceError(Box<Error + Send + Sync>),
}

pub type MyResult<T> = Result<T, MyError>;

impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            MyError::NotFound(ref msg) => write!(f, "Not found: {}", msg),
            MyError::PersistenceError(ref cause) => write!(f, "Persistence error: {}", cause),
        }
    }
}

impl Error for MyError {
    fn description(&self) -> &str {
        match *self {
            MyError::NotFound(ref msg) => msg,
            MyError::PersistenceError(ref cause) => cause.description(),
        }
    }

    fn cause(&self) -> Option<&Error> {
        match *self {
            MyError::NotFound(_) => None,
            // `*cause` does not live long enough
            MyError::PersistenceError(cause) => Some(&*cause),
        }
    }
}
该类型未实现trait core::marker::Sized 标准::错误::错误+发送+同步+静态[E0277]

类型`&Box未实现trait std::error::error

但是这些都不起作用。

在这种情况下:

match *self {
    MyError::NotFound(_) => None,
    MyError::PersistenceError(ref cause) => {
        let () = cause;
    },
}
这将告诉您,
原因
是一个

如果我们取消引用它一次,我们将有一个
,如果我们再次取消引用它,我们将有一个
std::error::error+Send+Sync
(这不是真正的类型)。然后,我们可以使用另一个引用,该引用可以隐式地生成
&Error

match *self {
    MyError::NotFound(_) => None,
    MyError::PersistenceError(ref cause) => Some(&**cause),
}
MyError::PersistenceError(ref cause) => Some(&cause)
match *self {
    MyError::NotFound(_) => None,
    MyError::PersistenceError(ref cause) => {
        let () = cause;
    },
}
match *self {
    MyError::NotFound(_) => None,
    MyError::PersistenceError(ref cause) => Some(&**cause),
}