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

时间:2019-06-30 19:46:33

标签: generics rust traits

如果已经实现了Result<T, ErrorType1>,是否可以将Result<T, ErrorType2>转换为ErrorType2::From(ErrorType1)?似乎应该有可能。

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

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

因为:

  • From是外来特征

  • Result<T, LocalErrorType>是外来类型,尽管LocalErrorType是本地类型

  • Result<T, ForeignErrorType>也是外来类型

我该如何实现?

1 个答案:

答案 0 :(得分:2)

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

  1. 在错误类型之间实现转换是常见且惯用的,从特定类型到更通用的错误类型。如果这两种类型中的任何一种都不比另一种更通用,则可以创建一个新的类型,将两者兼有(即,一个枚举,其中每个变量都包含不同的错误类型)。这样,转换结果就像使用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(())
    }
    

另请参阅: