Generics 锈病:泛型中的部分特征

Generics 锈病:泛型中的部分特征,generics,rust,Generics,Rust,我试图写一些基本的泛型: pub struct MyGeneric<T> { vec: Vec<T> } impl<T> MyGeneric<T> { fn add(&mut self, item: T) { if !self.vec.contains(&item) { self.vec.push(item); } } } 我试图通过多种方式实现Pa

我试图写一些基本的泛型:

pub struct MyGeneric<T> {
    vec: Vec<T>
}

impl<T> MyGeneric<T> {
    fn add(&mut self, item: T) {
        if !self.vec.contains(&item) {
            self.vec.push(item);
        }
    }
}
我试图通过多种方式实现PartialEq,查看API文档,但我自己没有找到解决方案。我对traits的概念不是很熟悉,所以我需要帮助


谢谢。

您需要将
T
的所有可能值限制为实现
PartialEq
的值,因为
Vec::contains()的定义要求:

pub struct MyGeneric<T> {
    vec: Vec<T>
}

// All you need is to add `: PartialEq` to this impl
// to enable using `contains()`
impl<T: PartialEq> MyGeneric<T> {
    fn add(&mut self, item: T) {
        if !self.vec.contains(&item) {
            self.vec.push(item);
        }
    }
}

fn main()
{
    let mut mg: MyGeneric<int> = MyGeneric { vec: Vec::new() };
    mg.add(1);
}
pub结构MyGeneric{
vec:vec
}
//您只需将`:PartialEq`添加到此impl
//要启用“contains”()`
impl-MyGeneric{
fn添加(&mut自我,项目:T){
if!self.vec.包含(&item){
自我向量推送(项目);
}
}
}
fn main()
{
让mut-mg:MyGeneric=MyGeneric{vec:vec::new()};
mg.添加(1);
}

泛型类型在大多数情况下都需要在其参数上指定一些界限,否则将无法验证泛型代码是否正确。例如,这里,
contains()
正在对项使用运算符
=
,但并非每种类型都定义了该运算符。标准trait
PartialEq
定义了操作符
=
,因此实现该trait的所有东西都保证有该操作符。

您可以扩展示例代码吗?我想我已经开始理解了,但不是很确定。@bender.rodriges我已经包含了在Rust 0.11中编译的最小示例。现在我明白了!我确实认为那个符号意味着派生。一直以来,我都试图像fmt::Show trait那样实现它。非常感谢。
pub struct MyGeneric<T> {
    vec: Vec<T>
}

// All you need is to add `: PartialEq` to this impl
// to enable using `contains()`
impl<T: PartialEq> MyGeneric<T> {
    fn add(&mut self, item: T) {
        if !self.vec.contains(&item) {
            self.vec.push(item);
        }
    }
}

fn main()
{
    let mut mg: MyGeneric<int> = MyGeneric { vec: Vec::new() };
    mg.add(1);
}