是否可以从通用特征实现中排除某种类型?

use*_*467 5 traits rust

From我正在尝试创建一个错误类型,并为 any 提供一揽子实现Error,但是由于该类型本身就是一个错误类型,所以Error我遇到了冲突:

pub struct ApiError(pub i64, pub String);

impl<T: Error> From<T> for ApiError {
    fn from(err: T) -> Self {
        Self(500, err.to_string())
    }
}

impl Error for ApiError {}
Run Code Online (Sandbox Code Playgroud)
error[E0119]: conflicting implementations of trait `std::convert::From<ApiError>` for type `ApiError`
 --> src/lib.rs:5:1
  |
5 | impl<T: Error> From<T> for ApiError {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T> From<T> for T;
Run Code Online (Sandbox Code Playgroud)

我认为这是因为我通过实施创建的Error循环ApiError。是否可以这样说T: Error & not ApiError并将我的特定类型从这个一揽子实现中排除From

如果这是不可能的,我很好奇无论如何似乎会做类似的事情?

Mic*_*son 5

你不能在 Rust 中做到这一点,但有一个解决方法。

查看文档,anyhow::Error没有实现Error,而是实现了Deref<Error>(和类似的特征)。这允许anyhow::Error默默地转换为&Error.

这意味着它现在可以实施From<T:Error>而不会遇到您提到的冲突。