我正在尝试用毯子创建一个错误类型From
实施任何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 {}
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;
我认为这是因为我通过实施创建的循环Error
on ApiError
。是否可以这样说T: Error & not ApiError
并将我的特定类型从这个一揽子实施中排除From
?
如果这是不可能的,我很好奇如何anyhow https://github.com/dtolnay/anyhow似乎做了类似的事情?
你不能在 Rust 中做到这一点,但有一个解决方法。
查看文档,anyhow::Error https://docs.rs/anyhow/latest/anyhow/struct.Error.html不执行Error
,而是它实现了Deref<Error> https://docs.rs/anyhow/latest/anyhow/struct.Error.html#impl-Deref-for-Error(以及类似的特征)。这允许anyhow::Error
默默地转换为&Error
.
这意味着它现在可以实现From<T:Error>
不会遇到你提到的冲突。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)