如何实现 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())
}
}
}
因为:
From
是外国性状
Result<T, LocalErrorType>
是外来类型,尽管 LocalErrorType
是本地类型
Result<T, ForeignErrorType>
也是外来类型
我怎样才能做到这一点?
一个不实现两个 Result
类型之间的转换。不需要这样的转换有两个原因:
在错误类型之间实现转换是常见且惯用的,从特定类型到更通用的错误类型。如果两种类型中的 none 比另一种更通用,则可以创建一个新类型,它是两者的总和(即每个变体包含不同错误类型的枚举)。这样,转换结果就像使用 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(())
}
另请参阅:
- What's the benefit of using a Result?
如果 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())
}
}
}
因为:
From
是外国性状Result<T, LocalErrorType>
是外来类型,尽管LocalErrorType
是本地类型Result<T, ForeignErrorType>
也是外来类型
我怎样才能做到这一点?
一个不实现两个 Result
类型之间的转换。不需要这样的转换有两个原因:
在错误类型之间实现转换是常见且惯用的,从特定类型到更通用的错误类型。如果两种类型中的 none 比另一种更通用,则可以创建一个新类型,它是两者的总和(即每个变体包含不同错误类型的枚举)。这样,转换结果就像使用
一样简单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(()) }
另请参阅:
- What's the benefit of using a Result?