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)
}