Vector 从借用的Vec中删除值时,如何避免移出借用?

Vector 从借用的Vec中删除值时,如何避免移出借用?,vector,rust,Vector,Rust,我有一个结构没有实现克隆或复制: struct MyStruct { data: Vec<MyData>, } 这不起作用,编译器抱怨说,当我使用到iter中时,我正在脱离借用的上下文。如果未将插入iter,则会失败,因为我正在创建&MyData的Vec,而不是MyData 我可以通过编写以下内容来解决这个问题,但可读性要差得多: let mut invalid_indicies = vec![]; for (i, data) in self.data.iter().enu

我有一个结构没有实现
克隆
复制

struct MyStruct {
    data: Vec<MyData>,
}
这不起作用,编译器抱怨说,当我使用
到iter
中时,我正在脱离借用的上下文。如果未将
插入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

您可以使用它从向量中删除项目:

fn clean_up(&mut self) {
    self.data.retain(|data| data.is_still_valid());
}

这个答案适用于
Vec
的特定用例。在更一般的情况下(例如,当使用没有与
Vec::retain
等效的容器时),您可以使用将数据从
self
中取出,然后再将其过滤并放回。
fn clean_up(&mut self) {
    self.data.retain(|data| data.is_still_valid());
}