gpt4 book ai didi

vector - 如何通过将它们转换为 None 来过滤 Option 向量中的项目?

转载 作者:行者123 更新时间:2023-11-29 08:08:02 26 4
gpt4 key购买 nike

我想过滤掉 Option 向量中的一些项目,我想在不创建新向量的情况下就地这样做,因为它可以通过 map< 的组合来完成collect。我不想使用 Vec::map_in_place,因为它已被弃用。

我找到了以下解决方案:

use std::mem;

fn main() {
let mut v = vec![
Some("10".to_owned()),
Some("5".to_owned()),
None,
Some("20".to_owned()),
];

for i in v.iter_mut() {
let j = match mem::replace(i, None) {
None => None,
Some(f) => {
if f == "20" {
None
} else {
Some(f)
}
}
};
mem::replace(i, j);
}
println!("v = {:?}", v);
}

playground

虽然它工作正常,但它为每个元素制作 2 个副本,无论该元素是否被修改。

是否有更符合习惯的解决方案,同时也需要更少的复制?

最佳答案

在 Vladimir 的评论之后

存在大量过度拟合具体示例的风险;以下内容也适用:

fn main() {
let mut v = vec![Some("10".to_owned()), Some("5".to_owned()),
None, Some("20".to_owned())];

for i in v.iter_mut() {
if i.as_ref().map_or(false, |f| *f == "20") {
i.take();
}
}
println!("v = {:?}", v);
}

初始答案

也许您过于简化了您的示例,但是对于给定的程序,如果只需要一个副本就可以完成,并且只有在需要更改时才可以。主要思想是您首先检查是否需要更改(即 iSome("20")),然后您只需进行更改。与 borrowchk 的一点舞蹈似乎是必要的,但解决方案如下:

use std::mem;

fn main() {
let mut v = vec![Some("10".to_owned()), Some("5".to_owned()),
None, Some("20".to_owned())];

for i in v.iter_mut() {
// Borrowchk-dance: make sure this borrow of i ends before we try to mutate
let is_a_twenty = match i {
&mut Some(ref f) if *f == "20" => true,
_ => false,
};
// Now that we're free to borrow i mutably, go ahead and do so
if is_a_twenty {
mem::replace(i, None);
}

}
println!("v = {:?}", v);
}

关于vector - 如何通过将它们转换为 None 来过滤 Option 向量中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com