Rust 强制特定结构在特征组合实现中的应用
我试图定义两个特性,以后可以用几种方式实现。 第一个是traitRust 强制特定结构在特征组合实现中的应用,rust,traits,Rust,Traits,我试图定义两个特性,以后可以用几种方式实现。 第一个是traitA,第二个是traitB,它基本上是实现traitA的元素向量 trait A{ fn名称(&self)->&str; } 性状B{ fn len(&self)->使用; fn添加(&mut self,项目:T)->bool; } #[衍生(部分)] 结构ImplA{ 名称:String, } ImplA为ImplA{ fn名称(&self)->&str{ &姓名 } } 结构ImplB{ 项目:Vec, } impl B代表imp
A
,第二个是traitB
,它基本上是实现traitA
的元素向量
trait A{
fn名称(&self)->&str;
}
性状B{
fn len(&self)->使用;
fn添加(&mut self,项目:T)->bool;
}
#[衍生(部分)]
结构ImplA{
名称:String,
}
ImplA为ImplA{
fn名称(&self)->&str{
&姓名
}
}
结构ImplB{
项目:Vec,
}
impl B代表impl B{
fn len(&self)->使用{
self.items.len()
}
fn添加(&mut self,项目:ImplA)->bool{
if!self.items.contains(&item){
self.items.push(项目);
真的
}否则{
假的
}
}
}
add
函数的代码强制项目实现类型A。
然后我定义了两个结构ImplA
,它们可以毫无问题地实现traitA
然后是structImplB
,它应该实现traitB
,但只接受
键入ImplA
我尝试了几种组合来签名add
函数,但它没有成功编译
最初的错误是
错误[E0308]:类型不匹配
-->src/main.rs:32:33
|
31 | fn添加(&mut self,项目:T)->bool{
|----此类型参数
32 | if!self.items.contains(&item){
|^^^应为结构'ImplA',找到类型参数'ImplA'`
|
=注意:应为引用“&ImplA”(结构“ImplA”)
找到引用“%T”(类型参数“T”)
我想我能理解,但提到的解决方案并不能解决我的问题,因为它意味着
ImplB
可以接受实现A
的任何结构,而这不是我想要的。您遇到的问题之一是add()的类型参数
允许每次调用a
时对其进行不同的实现,但在其他地方,对于B
的给定实现,您所依赖的类型总是相同的
在Rust中,可以使用B
trait上的关联类型来表示此约束:
trait B {
type Item: A;
fn len(&self) -> usize;
fn add(&mut self, item: Self::Item) -> bool;
}
然后,在实现B
时,为该实现的a
指定一个固定类型:
impl B for ImplB {
type Item = ImplA;
fn len(&self) -> usize {
self.items.len()
}
fn add(&mut self, item: ImplA) -> bool {
if !self.items.contains(&item) {
self.items.push(item);
true
} else {
false
}
}
}
您遇到的问题之一是,
add()
的type参数允许每次调用a
时使用不同的实现,但在其他地方,对于B
的给定实现,您依赖于它始终是相同的类型
在Rust中,可以使用B
trait上的关联类型来表示此约束:
trait B {
type Item: A;
fn len(&self) -> usize;
fn add(&mut self, item: Self::Item) -> bool;
}
然后,在实现B
时,为该实现的a
指定一个固定类型:
impl B for ImplB {
type Item = ImplA;
fn len(&self) -> usize {
self.items.len()
}
fn add(&mut self, item: ImplA) -> bool {
if !self.items.contains(&item) {
self.items.push(item);
true
} else {
false
}
}
}
B
的实现是否包含相同类型的值集合,或者所有实现A
的不同类型的值集合?停止使用类型参数隐藏名称。如果您有一个名为implA
的结构,您最不想做的就是调用您的类型参数implA
@Aplet123这不是真正的代码,I试图对这个问题做一个简单的例子,如果它更难阅读,请道歉。@PeterHall B的每个实现将只包含一种类型的As@horaciotellez很好,因为这是我在回答中假设的!:)B
的实现是否包含相同类型的值集合,或者所有实现A
的不同类型的值集合带类型参数的顶部阴影名称。如果您有一个名为implA
的结构,那么您最不想做的事情就是调用您的类型参数implA
@Aplet123这不是真正的代码,我试着对这个问题给出一个最小的示例,如果它更难阅读,那么很抱歉。@PeterHall B的每个实现将只包含一个t类型As@horaciotellez很好,因为这是我在回答中假设的!:)谢谢!这很好谢谢!这很好