我有以下定义:
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]);
我不明白为什么这很重要。为什么它甚至看那种类型?
答案 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"];