【问题标题】:Is it possible to exclude a type from generic trait implementation?是否可以从通用特征实现中排除类型?
【发布时间】:2022-10-02 11:07:28
【问题描述】:

我正在尝试为任何Error 创建一个带有毯子From 实现的错误类型,但是由于这种类型本身就是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 {}
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;

我认为这是因为我通过在ApiError 上实现Error 创建的循环。是否可以说T: Error &amp; not ApiError 之类的内容并将我的特定类型从From 的此一揽子实现中排除?

如果这不可能,我很好奇anyhow 似乎做了类似的事情?

【问题讨论】:

  • 不,这是不可能的。

标签: rust traits


【解决方案1】:

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

查看文档,anyhow::Error 没有实现Error,而是实现了Deref&lt;Error&gt;(和类似的特征)。这允许anyhow::Error 静默转换为&amp;Error

这意味着它现在可以实现From&lt;T:Error&gt; 而不会遇到您提到的冲突。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    相关资源
    最近更新 更多