如何实现 From 将一种结果类型转换为另一种结果类型?

How do I implement From to convert one Result type to another?

如果 ErrorType2::From(ErrorType1) 已经实现,是否可以将 Result<T, ErrorType1> 通用转换为 Result<T, ErrorType2>?好像应该可以。

这是我的第一次尝试,但无法编译。

impl<T> From<Result<T, LocalErrorType>> for Result<T, ForeignErrorType> {
    fn from<T>(res: Result<T, LocalErrorType>) -> Self {
        match sr {
            Ok(o) => Ok(o),
            Err(se) => Err(se.into())
        }
    }
}

因为:

我怎样才能做到这一点?

一个不实现两个 Result 类型之间的转换。不需要这样的转换有两个原因:

  1. 在错误类型之间实现转换是常见且惯用的,从特定类型到更通用的错误类型。如果两种类型中的 none 比另一种更通用,则可以创建一个新类型,它是两者的总和(即每个变体包含不同错误类型的枚举)。这样,转换结果就像使用 map_err:

    一样简单
    let res: Result<_, LocalErrorType> = do_something();
    let res: Result<_, GenericErrorType> = res.map_err(From::from);
    
  2. 您可能也不需要调用 map_err,因为 ? 运算符(或 1.13 之前的 try! 宏)已经使用下面是类似的程序。

    fn do_something() -> Result<Foo, LocalErrorType> { unimplemented!() }
    
    fn foo() -> Result<(), GenericErrorType> {
        let stuff = do_something()?;
        Ok(())
    }
    

另请参阅:

  • What's the benefit of using a Result?