从借用的Vec中删除值时,如何避免借入资金? [重复]

问题描述 投票:1回答:1

我有一个没有实现CloneCopy的结构:

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

vector rust
1个回答
3
投票

您可以使用Vec::retain从矢量中移除项目:

fn clean_up(&mut self) {
    self.data.retain(|data| data.is_still_valid());
}
© www.soinside.com 2019 - 2024. All rights reserved.