我正在try 为任何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 & not ApiError的内容,并将我的特定类型从From的全面实现中排除?

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

推荐答案

你不能在Rust 的地方做到这一点,但有一种方法可以解决.

看看文档,anyhow::Error并没有实现Error,而是实现了Deref<Error>(以及类似的特性).这允许将anyhow::Error静默地转换为&Error.

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

Rust相关问答推荐

重新导出proc宏导致未解决的extern crate错误""

如何最好地并行化修改同一Rust向量的多个切片的代码?

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

rust 迹-内存管理-POP所有权-链表

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

取得本地对象字段的所有权

带参考文献的 rust 元组解构

在运行特定测试时,如何 suppress cargo test 的空输出?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

如何在 Rust 中将函数项变成函数指针

需要一个有序向量来进行 struct 初始化

如何基于常量在Rust中跳过一个测试

如何在 Rust 中按 char 对字符串向量进行排序?

push 方法是否取得所有权?

有没有办法通过命令获取 Rust crate 的可安装版本列表?

仅当满足外部条件时如何添加到 actix web 的路由

为什么 Rust 标准库同时为 Thing 和 &Thing 实现特征?

返回 &str 但不是 String 时,borrow 时间比预期长

返回 &str 但不是 String 时,borrow 时间比预期长