如何在Vector上为我自己的结构实现PartialEq?

时间:2016-09-01 07:53:02

标签: rust traits

我有以下定义:

pub struct List<T> {
    memory:  Vec<T>,
}

对于此类型,我会得到相同的#[derive(PartialEq)],例如shutil

中的描述

我使用匹配表达式,如:

impl<T: PartialEq> PartialEq for List<T> {
    fn eq(&self, other: &List<T>) -> bool {
        self.memory == other.memory      
    }
}
impl<T: fmt::Debug> fmt::Debug for List<T> where T:Display {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        try!(write!(f, "["));
        for (count, v) in self.memory.iter().enumerate() {
            if count != 0 { try!(write!(f, ", ")); }
            try!(write!(f, "{}", v));
        }
        write!(f, "]")
    }
}
impl<T> List<T> {
    pub fn new() -> Self {
        List {
            memory: Vec::new(),
        }
    }
    // push() add to end of list
    pub fn push(&mut self, value: T) {
        self.memory.push(value);
    }
}

但是编译器给了我这些错误:

  

错误:类型不匹配[E0308]

     

如果! (* left_val == * right_val){

     

注意:在这个assert_eq的扩展中!

     

帮助:运行rustc --explain E0308查看详细说明

     

注意:预期类型librusty_data_structures::List<u32>

     

注意:找到类型[_; 4]

产生编译错误的main.rs

let mut listex: List<u32> = List::new();
listex.push(17);
listex.push(18);
listex.push(19);
listex.push(20);            
assert_eq!(listex, [17, 18, 19, 20]);

我不明白为什么这很重要。为什么它甚至看那种类型?

2 个答案:

答案 0 :(得分:2)

listex[17, 18, 19, 20]有不同的类型(List<u32>[_; 4]),因此您无法检查它们的相同性。您需要更改assert_eq!()的其中一个参数的类型,以便类型匹配。最简单的选择是引用listex的{​​{1}}:

memory

或者您可以将assert_eq!(&listex.memory[0..4], [17, 18, 19, 20]);转换为[17, 18, 19, 20],以便List<u32> PartialEq的实施可以付诸实施。

如果您要将List<T>与另一个listex进行比较,那么您的List<32>实施将允许检查相等性(尽管您需要PartialEq派生List<T> }为了对它们执行Debug

修改:至于您的问题“为什么它甚至会查看该类型?”,请注意您在assert_eq!()的实施中:

PartialEq

您指定fn eq(&self, other: &List<T>)仅适用于eq类型的两个参数(&List<T>指向&self)。

答案 1 :(得分:1)

以下是关于The Rust Programming Language Forum的cuviper response的解决方案

let mut listex: List<u32> = List::new();

listex.push(17);
listex.push(18);
listex.push(19);
listex.push(20);            

println!("{}", listex == [17, 18, 19, 20]);

测试:

recordFilePath = 
(CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"recordedFile.caf"];