正如您在评论中尝试的那样,我决定使用迭代器。
此版本适用于任何可克隆值(包括数字)。我们迭代子向量,并为每个子向量调用一个get
方法,该方法要么产生向量的元素,要么Some(&e)
超出None
范围。
and_then
then 接受来自 的值get
,如果是None
,则None
返回,否则,如果是Some(&e)
则Some(e.clone())
返回,即我们克隆该值(因为我们只有对来自的值的引用get
,我们无法存储它,我们必须复制值)。
collect
然后与 一起使用Iter<Option<T>>
,并且它方便地将其转入Option<Vec<T>>
,即None
如果迭代器中有一些None
s 则返回(这意味着某些数组没有足够大的大小),或者Some(Vec<T>)
如果一切正常则返回 。
fn main() {
let array = vec![
vec![1, 2, 3, 4],
vec![1, 2, 3, 4, 5],
vec![1, 2, 3, 4],
vec![1, 2, 3, 4],
];
let ac = array_column(&array, 0);
println!("{:?}", ac); // Some([1, 1, 1, 1])
let ac = array_column(&array, 3);
println!("{:?}", ac); // Some([4, 4, 4, 4])
let ac = array_column(&array, 4); // None
println!("{:?}", ac);
}
fn array_column<T: Clone>(array: &Vec<Vec<T>>, column: usize) -> Option<Vec<T>> {
array.iter()
.map( |subvec| subvec.get(column).and_then(|e| Some(e.clone())) )
.collect()
}