我正在尝试编写一些基本的通用:
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文档,但我自己找不到解决方案。我对特质概念不太熟悉,所以我需要帮助。
感谢。
答案 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
定义了运算符==
,因此保证实现该特征的所有内容都具有该运算符。