Generics 为实现特征的所有类型实现特征

Generics 为实现特征的所有类型实现特征,generics,rust,traits,Generics,Rust,Traits,我有一个问题: 实现trait事件的多个结构 所有这些都可以以相同的方式实现PartialEqtrait 我考虑过写这个(简短版本) 类型数据=Vec; 特质事件{ fn数据(&self)->&data; } 结构注释{ 数据:数据, } 结构注释{ 数据:数据, } 用于NoteOn的impl事件{ fn数据(&self)->&data{ &自我数据 } } 用于注释的impl事件{ fn数据(&self)->&data{ &自我数据 } } T的impl PartialEq{ fn eq

我有一个问题:

  • 实现trait
    事件的多个结构
  • 所有这些都可以以相同的方式实现
    PartialEq
    trait
我考虑过写这个(简短版本)

类型数据=Vec;
特质事件{
fn数据(&self)->&data;
}
结构注释{
数据:数据,
}
结构注释{
数据:数据,
}
用于NoteOn的impl事件{
fn数据(&self)->&data{
&自我数据
}
}
用于注释的impl事件{
fn数据(&self)->&data{
&自我数据
}
}
T的impl PartialEq{
fn eq(&self,b:&T)->bool{
self.data()==b.data()
}
}
fn main(){
println!(“你好,世界!”);
}

这无法编译:

error[E0119]:类型`&``的trait`std::cmp::PartialEq`的实现冲突:
-->src/main.rs:23:1
|
23 |针对T的impl PartialEq{
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
=注意:板条箱“核心”中的实现冲突:
-impl std::cmp::PartialEq for&A
其中A:std::cmp::PartialEq,A:?大小,B:?大小;
=注:下游板条箱可能对类型实施特征“事件”`&_`
错误[E0210]:类型参数'T'必须用作某些本地类型(例如'MyStruct')的类型参数
-->src/main.rs:23:1
|
23 |针对T的impl PartialEq{
|必须将类型参数“T”用作某些本地类型的类型参数
|
=注意:类型参数只能实现当前板条箱中定义的特征
这里怎么了? 或者有没有其他方法可以通用地实现此
PartialEq
,而不必为
NoteOn
Noteff
分别键入一次

谢谢你

以下是我在尽可能地“尝试”做我想做的事情,但是在@trentcl和@Shepmaster的评论之后,我用了不同的方式

我使用了@trentctl提到的枚举,以便能够在不同类型之间切换, 我将枚举值保存在公共结构事件中,以便轻松包装不同的对象并向事件添加更多代码。 这样做也有助于创建一个简单的Vec类型

在这里,我想我只需要Enum,而不需要事件和带有Enum的属性,我仍在学习变量Enum的用法

@trentcl也提到了我不拥有Vec类型的问题,因此我将Vec包装在一个struct-Sec中,而不是简单地为该类型添加别名。 这使得我的PartialEq实现与Vec类型分离(如果我理解,但我不确定) =>我在这里遇到麻烦的原因是,我认为使用
类型A=B;
确实创建了一个新类型,但文档中确实说明了它的别名(这可能会导致我无法为Vec实现PartialEq的原因) 尽管最后我想我在这一点上也可能大错特错,因为我创建了一个人工结构来包装1个属性,这一事实似乎也适得其反

=>因此,现在总结一下,谢谢大家,我将继续努力,看看如何提高效率,但我想我只是在生锈的情况下使用了错误的材料,我不确定这是一个好答案,希望得到反馈或其他建议

类型数据=Vec;
#[导出(调试)]
枚举事件impl{
注释(u8),
附注(u8)
}
#[导出(调试)]
结构事件{
数据:数据,
i:EventImpl
}
impl事件{
fn新(数据:数据)->自{
事件{
i:匹配数据[0]{
0=>EventImpl::NoteOn(数据[1]),
1=>EventImpl::NoteOff(数据[1]),
_=>恐慌!(“unk”)
},
数据:数据
}
}
fn数据(&self)->&data{
&自我数据
}
}
#[导出(调试)]
结构顺序{
酒吧用品:Vec
}
针对Seq的impl PartialEq{
fn eq(&self,o:&self)->bool{
//我必须学习迭代器的实现
让mut r=o.things.len()==self.things.len();
如果{
返回false;
}
对于0..o.things.len()中的i{
r=r&o.things[i]==self.things[i];
}
R
}
}
事件的impl PartialEq{
fn eq(&self,o:&self)->bool{
//我必须学习迭代器的实现
std::mem::discriminant(&self.i)==std::mem::discriminant(&o.i)&o.data()==self.data()
}
}
fn main(){
让mut s:Seq=Seq{things:vec![Event::new(vec![1,2,3])]};
s、 推(Event::new(vec![0,1,2]);
设s2:Seq=Seq{things:vec![Event::new(vec![1,2,3]),Event::new(vec![0,1,2])};
println!(“你好,世界!{:?}{:?}”,s,s.things[1].data());
println!(“S1==S2?{}”,s==S2);
}

您的问题似乎可以用的答案来回答。如果没有,请您的问题解释差异。否则,我们可以将此问题标记为已回答。更多地猜测您的失败原因,您的问题可能会由的答案来回答。如果没有,请您的问题解释差异。其他wise,我们可以将此问题标记为已回答。也许您可以解释一下您对编译器帮助消息的不理解之处?@Shepmaster谢谢您的评论,我制作了一个游乐场示例和可编译示例(无需板条箱)。问题是一个冲突,尽管错误消息:T必须在本地类型中使用对我来说没有什么意义,因为T被用作本地类型。再次感谢,这是一个重复(回答:您没有,但有解决方法)。更广泛地说,我认为您的问题由和中的一个或两个解决(请务必阅读所有答案)。