【发布时间】:2019-02-24 23:22:41
【问题描述】:
我有一个没有实现 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,它会失败,因为我正在创建&MyData 的Vec,而不是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 和类似的序列运算符来修改结构所拥有的向量,同时仍然借用而不是在clean_up() 中移动self?
【问题讨论】: