Rust 强制特定结构在特征组合实现中的应用

Rust 强制特定结构在特征组合实现中的应用,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

我试图定义两个特性,以后可以用几种方式实现。 第一个是trait
A
,第二个是trait
B
,它基本上是实现trait
A
的元素向量

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
,它们可以毫无问题地实现trait
A
然后是struct
ImplB
,它应该实现trait
B
,但只接受 键入
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很好,因为这是我在回答中假设的!:)谢谢!这很好谢谢!这很好