Rust 如何实现'From<;一些特质';s关联类型>`
我正在编写一个新的板条箱,我希望它能够与trait(在另一个板条箱中定义)的任何实现一起使用。其特征如下所示:Rust 如何实现'From<;一些特质';s关联类型>`,rust,Rust,我正在编写一个新的板条箱,我希望它能够与trait(在另一个板条箱中定义)的任何实现一起使用。其特征如下所示: pub特征{ 类型错误; ... } 我有自己的Error类型,但有时我只想不加修改地转发底层错误。我的直觉是这样定义一种类型: 发布枚举错误{ TraitError(T::Error), ... } 这类似于所鼓励的模式,并且似乎是惯用的。它工作正常,但我还想在实现中使用?,因此我需要从实现: impl From查找错误{ fn from(e:T::Error)->Self{Se
pub特征{
类型错误;
...
}
我有自己的Error
类型,但有时我只想不加修改地转发底层错误。我的直觉是这样定义一种类型:
发布枚举错误{
TraitError(T::Error),
...
}
这类似于所鼓励的模式,并且似乎是惯用的。它工作正常,但我还想在实现中使用?
,因此我需要从实现:
impl From查找错误{
fn from(e:T::Error)->Self{Self::TraitError(e)}
}
这失败了,因为它与T的impl-core::convert::From冲突。我想我理解为什么,Trait
的其他一些实现者可以设置type Error=my_crater::Error
,这样两个impl
s都可以应用,但我如何才能实现类似的语义呢
我看了其他一些板条箱,它们似乎是通过将它们的错误
(或等效)泛化到错误类型本身,而不是trait实现来处理这个问题的。这当然有效,但:
- 直到我们有,它是更详细。我的
T
实际上实现了多个trait,每个trait都有自己的Error
类型,因此我现在必须返回Result
等类型李>
- 可以说,它的表现力较低(因为与
Trait
的关系消失了)
使我的<代码>错误>代码>泛型在个别类型中是最好的(最惯用的)选项?< /p> < p>而不是从 > <代码> > < <错误>代码>枚举>,考虑使用“<代码> > />代码>指定要返回的变量。
这甚至适用于使用关联类型的类型上的枚举泛型,例如:
TraitA特征{
类型错误;
fn do_stuff(&self)->结果;
}
性状TraitB{
类型错误;
fn做其他事情(自我)->结果;
}
枚举错误{
DoStuff(::错误),
DoOtherStuff(::错误),
}
fn my_函数(t:t)->结果{
t、 do_stuff().map_err(Error::DoStuff)?;
t、 do_other_stuff().map_err(Error::DoOtherStuff)?;
好(())
}
这里重要的一点是Error
没有来自
实现(除了笼统的实现),并且变量是使用map\u err
指定的。当传递到map\u err
时,它可以被解释为fn(::Error)->Error
。同样的情况也发生在错误::DoOtherStuff
上
无论Error
有多少变体,以及它们是否为同一类型,这种方法都是可伸缩的。阅读函数的人可能会更清楚,因为他们不需要检查
实现中的,也不需要检查转换类型在函数中出现的位置,就可以发现某个错误来自某个地方。可以使用.map\u err(error::traitorr)代替
中的?
而不是简单的?
,这样错误类型就已经是error
而不是T::error
,?
将使用覆盖impl From for T
和T=error
。是的,这是有效的,思考它是唯一可行的方法。From
特性只对一个类型进行操作,它不知道它来自哪里。如果TraitA::Error
和TraitB::Error
的类型相同,会发生什么情况?我仍然需要将Error
generic,但它可以是一种类型的generic,而不是每一个特征。你不能将t
与t:TraitA+TraitB
绑定,并且在Error
中有两个变体,一个TraitA(::Error)
和映射错误(…)?
取决于所使用的特征?即使它们有相同的类型,它们也会有不同的变体,如果使用.map\u err(…)?
,您也不需要从为错误实现。是的,这正是我所拥有的,因为我尝试了您的map\u err()
建议。到目前为止,我发现的唯一问题是它仍然冗长(与?
)相比),但公共API非常简洁。现在我想知道为什么我没有在其他地方看到过这种用法。详细说明是指定要返回的变体所必需的,我相信这是标准做法,因为实现From
是不可行的,因为这是map\u err
的设计目的。如果这已经解决了你的问题,我会发布一个总结解决方案的答案。