【问题标题】:How can I avoid moving out of a borrow when removing values from a borrowed Vec? [duplicate]从借用的 Vec 中删除值时,如何避免移出借用? [复制]
【发布时间】:2019-02-24 23:22:41
【问题描述】:

我有一个没有实现 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,它会失败,因为我正在创建&amp;MyDataVec,而不是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

【问题讨论】:

    标签: vector rust


    【解决方案1】:

    您可以使用Vec::retain 从原位向量中删除项目:

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

    【讨论】:

    • 此答案适用于Vec 的特定用例。在更一般的情况下,(例如,当使用没有 Vec::retain 等效项的容器时),您可以使用 std::mem::swap 将数据从 self 中取出,然后再过滤并将其放回。@ 987654323@.
    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多