这个问题在这里已有答案:
我有一个没有实现Clone
或Copy
的结构:
struct MyStruct {
data: Vec<MyData>,
}
我想在结构上编写一个“清理”不再有效的数据的函数:
fn clean_up(&mut self) {
self.data = self.data.into_iter()
.filter(|data| data.is_still_valid())
.collect()
}
这不起作用,编译器抱怨我在使用into_iter
时已经离开了借用的上下文。没有into_iter
,它失败了因为我创造了Vec
的&MyData
,而不是MyData
。
我可以通过编写类似下面的内容来修复此问题,但它的可读性要低得多:
let mut invalid_indicies = vec![];
for (i, data) in self.data.iter().enumerate() {
if !data.is_still_valid() {
invalid_indicies.push(i);
}
}
for i in invalid_indicies {
self.data.remove(i);
}
是否有可能使用filter
和类似的序列运算符来修改结构所拥有的向量,同时仍然借用而不是在self
中移动clean_up()
?
您可以使用Vec::retain
从矢量中移除项目:
fn clean_up(&mut self) {
self.data.retain(|data| data.is_still_valid());
}