从实现`Error`特征的对象实现泛型转换

Fer*_*rio 5 rust

我无法获得以下代码进行编译.

  • 我收到一个From已经实现的错误.
  • 如果我删除了手动impl,From我得到了From未实现的错误.
  • 如果我没有实现Error它工作正常.

我想这是由于impl<T> From<T> for T核心的空白.我应该如何解决这个问题?不实施Error不是一个真正的选择.

代码(游乐场)

use std::fmt;
use std::io;
use std::error::Error;

#[derive(Debug)]
enum ErrorType {
    Other(Box<Error>)
}

impl fmt::Display for ErrorType {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        fmt.write_str("not implemented")
    }
}

impl Error for ErrorType {
    fn description(&self) -> &str {
        use self::ErrorType::*;
        match *self {
            Other(ref err) => err.description(),
        }
    }
}

impl<E: Error + 'static> From<E> for ErrorType {
    fn from(other: E) -> Self {
        ErrorType::Other(Box::new(other))
    }
}

fn ret_io_err() -> Result<(), io::Error> {
    Ok(())
}

fn ret_error_type() -> Result<(), ErrorType> {
    try!(ret_io_err());
    Ok(())
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 3

你不知道。

无论如何,这个实现有点无用。这意味着所有其他错误类型将立即被装箱。那时,您不妨利用现有的转换Box<Error>并使用

如果您想要一个实际上保留统一错误类型的错误类型,则需要From为每个错误实现一次。该error-type板条箱可以帮助定义统一的错误类型。