如何使用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_traitsnegative_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>并想转换EMyError::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然后不清楚返回错误是否应该只是EMyError::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_traits
  • negative_impls

以上是如何使用From&lt;T&gt;制作可从所有其他类型转换的类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>