Rust 从实现'Error'特性的对象实现泛型转换

Rust 从实现'Error'特性的对象实现泛型转换,rust,Rust,我无法编译以下代码 我从中得到一个错误,该错误已经实现 如果我从中删除的手动impl,我会得到一个错误,即中的未实现 如果我没有实现错误它可以正常工作 我想这是由于在内核中的t/的空白IMPL>代码> IMPL。我应该如何解决这个问题?不执行错误实际上不是一个选项 代码() 使用std::fmt; 使用std::io; 使用std::error::error; #[导出(调试)] 枚举错误类型{ 其他(方框) } impl fmt::显示错误类型{ fn fmt(&self,fmt:&mut

我无法编译以下代码

  • 我从中得到一个错误,该错误已经实现
  • 如果我从中删除
    的手动impl,我会得到一个错误,即
    中的
    未实现
  • 如果我没有实现
    错误
    它可以正常工作

我想这是由于在内核中的t/<代码>的空白IMPL>代码> IMPL。我应该如何解决这个问题?不执行

错误
实际上不是一个选项

代码()

使用std::fmt;
使用std::io;
使用std::error::error;
#[导出(调试)]
枚举错误类型{
其他(方框)
}
impl fmt::显示错误类型{
fn fmt(&self,fmt:&mut fmt::Formatter)->fmt::Result{
fmt.write_str(“未实施”)
}
}
ErrorType的impl错误{
fn描述(&self)->&str{
使用self::ErrorType::*;
匹配自我{
其他(参考错误)=>错误描述(),
}
}
}
其实你不知道

无论如何,这种实现将有点无用。这意味着所有其他错误类型都将立即装箱。在这一点上,您最好只使用现有的涉及
Box
的转换,并使用它


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

根据上面的评论,我发现这一方法仅适用于:

impl<T: error::Error + 'static> From<Box<T>> for Error {
    fn from(e: Box<T>) -> Self {
        Error::Other(e)
    }
}
但如果您需要一般错误(例如,对于用户定义的任务),则不需要使用enum包装它,请尝试直接使用它:

trait AnyTask {
    fn do_it(&self) -> Result<Success, Box<Error>>;
}

嗯,捕获所有错误是这种通用实现的全部要点。不幸的是,我没有可以使用的现有impl。只有当我总是想返回
时,这才有效。现在,我使用
map\u err
在每个调用站点包装它。@Ferio:问题是,即使您可以编写impl,它也会立即阻止您为任何其他类型实现更具体的逻辑。您的
错误类型
枚举实际上与
相同。你不需要使用<代码> MAPyErr < /C>,你只需要为<源代码错误类型> <代码> > IMPL编写一个<代码>,这就是<代码>错误类型被设计的。真的…我没有考虑<代码>如何尝试!<代码>已实现。似乎一概而论是不可能的。这在字面上是不一样的,你不能把外来的特质应用到盒子里
try!(any_result().map_err(Box::new))
trait AnyTask {
    fn do_it(&self) -> Result<Success, Box<Error>>;
}
fn do_it(&self) -> Result<Succeed, Box<Error>> {

    let row = try!(self.database.find_last());

    if row.some_condition {
        return Err("I don't like it!".into());
    }

    try!(self.database.insert(row));

    Ok(Success)
}