Rust 基于某些条件从Vec中删除元素

Rust 基于某些条件从Vec中删除元素,rust,Rust,我的代码如下所示: struct Bar { i: i32, } struct Foo { v: Vec<Bar>, } impl Foo { fn foo(&mut self) { self.v.drain(self.v.iter().filter(|b| b.i < 10)); } } 结构栏{ i:i32, } 结构Foo{ v:Vec, } impl-Foo{ fn-foo(&mut-self){ 自v漏极(

我的代码如下所示:

struct Bar {
    i: i32,
}

struct Foo {
    v: Vec<Bar>,
}

impl Foo {
    fn foo(&mut self) {
        self.v.drain(self.v.iter().filter(|b| b.i < 10));
    }
}
结构栏{
i:i32,
}
结构Foo{
v:Vec,
}
impl-Foo{
fn-foo(&mut-self){
自v漏极(自v iter()过滤器(|b | b.i<10));
}
}
请注意,不允许复制或克隆
Bar

我想删除所有不满足该条件的
条。起初我以为我可以迭代它们并调用
remove
,但如果存在完全有意义的不可变借用,我不允许有两个可变借用或一个可变借用

我想最简单的方法就是
克隆
过滤
收集
,但我不允许克隆或复制


如何执行此操作?

如果查看
Vec
的界面,将找不到基于谓词擦除某些元素的方法。相反,您将发现哪些元素保持基于谓词

当然,这两种方法都是对称的,只是如果通过“remove”或“erase”过滤方法名,
retain
更难找到(它的描述中确实包含“remove”)

提供的示例说明了这一点:

let mut vec = vec![1, 2, 3, 4];
vec.retain(|&x| x % 2 == 0);
assert_eq!(vec, [2, 4]);

在夜间防锈中,您可以使用:

您还可以选择修改正在迭代的值:

bars.drain_filter(|b| {
    b.i -= 1;
    b.i < 10
});
bar.排水过滤器(| b |{
b、 i-=1;
b、 i<10
});

我通过以下方式理解方法名称:令人困惑的是,“filter”不过滤与谓词匹配的元素,“retain”则保留与谓词匹配的元素。我认为这对新程序员来说会更直观。@mako:正是因为这个原因,我更喜欢
retain
。不知何故,我已经很难处理布尔值了,所以如果保留/丢弃哪些元素的语义不清楚,那对我来说就更难了。
let rejects: Vec<_> = bars.drain_filter(|b| b.i < 10).collect();
bars.drain_filter(|b| {
    b.i -= 1;
    b.i < 10
});