gpt4 book ai didi

rust - 通用结构的过滤向量

转载 作者:行者123 更新时间:2023-11-29 08:29:10 26 4
gpt4 key购买 nike

我正在尝试让这个过滤器工作,我的其他测试通过了,但是 find_by 函数没有编译。我收到错误 type 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() }]);
}
}

如果我删除过滤器,代码编译并且测试失败并出现预期的以下错误:

left: `[Cat { name: "Mittens" }, Cat { name: "Tiger" }]`,
right: `[Cat { name: "Tiger" }]`'

最佳答案

如果您定义了 Named 特征,您的 Cat 将实现它。此特征包含 name() 方法,从而解决了您的问题。

以下是要应用的主要更改:

// …
pub trait Named {
fn name(&self) -> &str;
}

impl<T> Repository<T> where T: Named {
// …
// 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 {
// …
impl Named for Cat {
fn name(&self) -> &str {
&self.name
}
}

参见 the whole code在 rust Playground 上。

关于rust - 通用结构的过滤向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54491118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com