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" }]`'