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

时间:2015-06-23 09:41:12

标签: rust

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

  • 我收到$(".clickable").click(function( event ) { var target = $( event.target ); if ( !target.is( "a" ) ) { window.location=$(this).data("link"); } } 已经实施的错误。
  • 如果我删除From的手动impl,则会收到From未执行的错误。
  • 如果我没有实施From,那就可以了。

我认为这是由于核心中的空白impl Error。我应该如何解决这个问题?不实施impl<T> From<T> for T实际上不是一种选择。

代码(playground

Error

2 个答案:

答案 0 :(得分:3)

你没有。

无论如何,这种实施有点无用。这意味着所有其他错误类型将立即被装箱。此时,您也可以使用涉及Box<Error>的现有转化,然后使用

如果您想要一个实际保留统一错误类型的错误类型,您需要为每个错误类型实施一次Fromerror-type包可以帮助定义统一错误类型。

答案 1 :(得分:0)

根据上述评论,我发现这种方法只有作用:

impl<T: error::Error + 'static> From<Box<T>> for Error {
    fn from(e: Box<T>) -> Self {
        Error::Other(e)
    }
}

要使用它,您应该Box错误:

try!(any_result().map_err(Box::new))

但是如果您需要一般性错误(例如用户定义的任务),您不需要用枚举包装它,尝试直接使用它:

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

可以在任何地方使用try!.into()。这样:

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)
}
相关问题