如何使用From<T>制作可从所有其他类型转换的类型?
我希望我的类型MyError可以从所有其他类型转换。我尝试这样做:
impl<T> From<T> for MyError {
fn from(_: T) -> Self {
MyError::Unknown
}
}
但我收到以下错误:
error[E0119]: conflicting implementations of trait `std::convert::From<MyError>` for type `MyError`
--> src/main.rs:26:5
|
26 | impl<T> From<T> for MyError {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<T> From<T> for T;
error[E0119]: conflicting implementations of trait `std::convert::From<MyError>` for type `MyError`
--> src/main.rs:26:5
|
26 | impl<T> From<T> for MyError {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<T> From<T> for T;
这是有道理的,因为这样T是必然的MyError,并且此实现由impl<T> From<T> for T. 理想情况下,我将能够排除MyError来自T这样的:
但显然这行不通。有什么方法可以完成我想要做的事情吗?
回答
给定您指定的内容,您可以使用以下功能auto_traits和negative_impls仅夜间功能来实现它:
#![feature(auto_traits, negative_impls)]
enum MyError {
A,
B,
C,
Unknown,
}
auto trait IsNotMyError {}
impl !IsNotMyError for MyError {}
impl<T: IsNotMyError> From<T> for MyError {
fn from(_: T) -> Self {
Self::Unknown
}
}
但是,这个 impl 对 来说不是很有用?,这就是我假设您正在使用它的目的。
假设您收到 aResult<T, E>并想转换E为MyError::Unknownusing ?,它将不起作用:
fn f<T, E>(f: impl FnOnce() -> Result<T, E>) -> Result<T, MyError> {
let value = f()?;
Ok(value)
}
您将收到以下错误消息:
error[E0277]: the trait bound `E: IsNotMyError` is not satisfied
--> src/lib.rs:24:20
|
24 | let value = f()?;
| ^ the trait `IsNotMyError` is not implemented for `E`
这是因为E可能是MyError然后不清楚返回错误是否应该只是E或MyError::Unknown。
相反,.map_err(|_| MyError::Unknown)?如果您想丢弃错误,则建议这样做,而不是为其实施From<T>:
fn f<T, E>(f: impl FnOnce() -> Result<T, E>) -> Result<T, MyError> {
let value = f().map_err(|_| MyError::Unknown)?;
Ok(value)
}
也就是说,假设您想丢弃原始错误,否则只需用泛型包装您的错误枚举E并将错误传回。
您可以在不稳定的书中找到有关上述功能的更多信息:
auto_traitsnegative_impls