Rust 泛型结构的过滤向量
我正在尝试让这个过滤器工作,我的其他测试通过了,但是Rust 泛型结构的过滤向量,rust,Rust,我正在尝试让这个过滤器工作,我的其他测试通过了,但是find\u by函数没有编译。我得到一个错误在类型T上没有字段名。关于访问字段的筛选器,我在这里遗漏了什么?我制作了一个没有泛型的代码版本,它工作正常 这是我的密码: pub struct Repository<T> { store: Vec<T> } impl<T> Repository<T> { pub fn create() -> Repository<T&g
find\u by
函数没有编译。我得到一个错误在类型T上没有字段名
。关于访问字段的筛选器,我在这里遗漏了什么?我制作了一个没有泛型的代码版本,它工作正常
这是我的密码:
pub struct Repository<T> {
store: Vec<T>
}
impl<T> Repository<T> {
pub fn create() -> Repository<T> {
Repository::<T> {
store: vec![]
}
}
pub fn find_all(self) -> Vec<T> {
self.store
}
pub fn add(&mut self, item: T) {
&mut self.store.push(item);
}
// this method returns an error
pub fn find_by(self, name: &str) -> Vec<T> {
self.store.into_iter().filter(|&e| e.name == name).collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
// ...
#[test]
fn can_find_objects_in_repository_by_param() {
#[derive(Debug, PartialEq)]
pub struct Cat { pub name: String };
impl Cat {
pub fn create(name: &str) -> Cat { Cat { name: name.to_string() } }
}
let mut repo = Repository::<Cat>::create();
let c1 = Cat::create("Mittens");
let c2 = Cat::create("Tiger");
repo.add(c1);
repo.add(c2);
assert_eq!(repo.find_by("Tiger"), vec![Cat { name: "Tiger".to_string() }]);
}
}
如果您定义一个名为的特征,您的Cat将实现该特征,那么它就可以工作。此特性包含
name()
方法,从而解决了您的问题
以下是要应用的主要更改:
/…
发布特性命名为{
fn名称(&self)->&str;
}
impl存储库,其中T:已命名{
// …
//此方法返回一个错误
pub fn find_by(self,name:&str)->Vec{
self.store.into_iter().filter(|e | e.name()==name.collect())
}
// …
#[cfg(测试)]
模试验{
// …
以猫命名{
fn名称(&self)->&str{
&姓名
}
}
请参见第页。您正试图访问
T
上的字段name
,但该字段不存在。存储库
必须对任何可能的T
有效,因此您不能假设它具有name
属性。使用具有name
访问器的特征约束T
,或者使用闭包而不是筛选器参数的字符串。的可能重复
left: `[Cat { name: "Mittens" }, Cat { name: "Tiger" }]`,
right: `[Cat { name: "Tiger" }]`'