【发布时间】:2021-06-17 23:56:29
【问题描述】:
给定一个结构如下:
#[derive(Debug)]
struct Item {
id: u32
}
impl Item {
fn new(id: u32) -> Item {
Item { id }
}
}
我正在寻找一种在不获取其所有权的情况下对该结构的向量执行过滤器的方法。以下代码将无法工作,因为所有权已被移动:
fn main() {
let items: Vec<Item> = vec![Item::new(1), Item::new(2), Item::new(3)];
let odd_items: Vec<Item> = items.into_iter()
.filter(| item | item.id % 2 == 1)
.collect();
for i in odd_items.iter() { println!("{:?}", i); }
for i in items.iter() { println!("{:?}", i); }
}
目前,我有两种解决方案:
- 有一个
&Item而不是Item的向量,但是,我发现从Vec<Item>开始但以Vec<&Item>结束有点尴尬:
fn main() {
let items: Vec<Item> = vec![Item::new(1), Item::new(2), Item::new(3)];
let odd_items: Vec<&Item> = items.iter()
.filter(| item | item.id % 2 == 1)
.collect();
for i in odd_items.iter() { println!("{:?}", i); }
for i in items.iter() { println!("{:?}", i); }
}
- 克隆一个初始向量。我更喜欢这个,但它会导致不必要的克隆,我更喜欢在过滤后只克隆项目:
fn main() {
let items: Vec<Item> = vec![Item::new(1), Item::new(2), Item::new(3)];
let odd_items: Vec<Item> = items.clone()
.into_iter()
.filter(| item | item.id % 2 == 1)
.collect();
for i in odd_items.iter() { println!("{:?}", i); }
for i in items.iter() { println!("{:?}", i); }
}
我想知道是否有更好的方法可以在不丢失所有权的情况下过滤向量。
【问题讨论】:
标签: rust