Rust:泛型中的PartialEq特征

时间:2014-09-25 11:09:45

标签: 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);
        }
    }
}

但收到错误:

priority_set.rs:23:10: 23:35 error: the trait `core::cmp::PartialEq` is not implemented for the type `T`
priority_set.rs:23      if !self.vec.contains(&item) {
                            ^~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

我试图以几种方式实现PartialEq查看API文档,但我自己找不到解决方案。我对特质概念不太熟悉,所以我需要帮助。

感谢。

1 个答案:

答案 0 :(得分:5)

您需要将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);
}

泛型类型需要在大多数时间指定其参数的某些边界,否则无法验证通用代码是否正确。例如,contains()在项目中使用运算符==,但并非每种类型都可以定义该运算符。标准特征PartialEq定义了运算符==,因此保证实现该特征的所有内容都具有该运算符。