Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何实现'From<;一些特质';s关联类型>`_Rust - Fatal编程技术网

Rust 如何实现'From<;一些特质';s关联类型>`

Rust 如何实现'From<;一些特质';s关联类型>`,rust,Rust,我正在编写一个新的板条箱,我希望它能够与trait(在另一个板条箱中定义)的任何实现一起使用。其特征如下所示: pub特征{ 类型错误; ... } 我有自己的Error类型,但有时我只想不加修改地转发底层错误。我的直觉是这样定义一种类型: 发布枚举错误{ TraitError(T::Error), ... } 这类似于所鼓励的模式,并且似乎是惯用的。它工作正常,但我还想在实现中使用?,因此我需要从实现: impl From查找错误{ fn from(e:T::Error)->Self{Se

我正在编写一个新的板条箱,我希望它能够与trait(在另一个板条箱中定义)的任何实现一起使用。其特征如下所示:

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
的设计目的。如果这已经解决了你的问题,我会发布一个总结解决方案的答案。