假设我有这个向量:
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
)。我应该在删除项目之前手动检查项目是否存在于索引处吗?
[如果您想按索引删除,我想说一种更为惯用的方式是使用enumerate
和filter_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
方法中出现的恐慌。
我如何捕捉/优美地应对这种恐慌?
你不知道。在锈病中,恐慌不适合捕捉。它们不是例外,而是程序必须坚持的某种不变性。
绝对不要惊慌。曾经!
您可以做的是,如果要查找要删除的索引是否存在,请先使用get()
。
fn check_and_remove<T>(vec: &mut Vec<T>, index: usize) {
if vec.get(index).is_some() {
vec.remove(index);
}
}