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());
}