如果已经实现了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>
也是外来类型
我该如何实现?
答案 0 :(得分:2)
一个不能实现两种Result
类型之间的转换。不需要进行这种转换有两个原因:
在错误类型之间实现转换是常见且惯用的,从特定类型到更通用的错误类型。如果这两种类型中的任何一种都不比另一种更通用,则可以创建一个新的类型,将两者兼有(即,一个枚举,其中每个变量都包含不同的错误类型)。这样,转换结果就像使用map_err
一样简单:
let res: Result<_, LocalErrorType> = do_something();
let res: Result<_, GenericErrorType> = res.map_err(From::from);
您可能也不需要调用map_err
,因为?
运算符(或1.13之前的try!
宏)已经使用下面的类似过程转换了错误类型。
fn do_something() -> Result<Foo, LocalErrorType> { unimplemented!() }
fn foo() -> Result<(), GenericErrorType> {
let stuff = do_something()?;
Ok(())
}
另请参阅: