如何安全地从向量中删除项目?

问题描述 投票:0回答:2

假设我有这个向量:

let mut v = vec![1,2,3];

而且我想从中删除一些项目:

v.remove(3);

恐慌。我该如何捕捉/优美地应对这种恐慌?我尝试使用panic::catch_unwind,但似乎不适用于矢量(std::vec::Vec<i32> may not be safely transferred across an unwind boundary)。我应该在删除项目之前手动检查项目是否存在于索引处吗?

vector rust
2个回答
1
投票

[如果您想按索引删除,我想说一种更为惯用的方式是使用enumeratefilter_map的组合:

fn main() {
    let v = vec![1, 2, 3];
    let predicate = |(index, val): (usize, &u8)| {
        if index == 3 {
            Some(*val)
        } else {
            None
        }
    };
    let v2: Vec<u8> = v.iter().enumerate().filter_map(predicate).collect();

    println!("{:?}", v2);
}

这样,您的代码是类型安全的,并且不会出现remove方法中出现的恐慌。


0
投票

我如何捕捉/优美地应对这种恐慌?

你不知道。在锈病中,恐慌不适合捕捉。它们不是例外,而是程序必须坚持的某种不变性。

绝对不要惊慌。曾经!

您可以做的是,如果要查找要删除的索引是否存在,请先使用get()

fn check_and_remove<T>(vec: &mut Vec<T>, index: usize) {
    if vec.get(index).is_some() {
        vec.remove(index);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.