gpt4 book ai didi

rust - 在Rust中实现PHP array_column

转载 作者:行者123 更新时间:2023-12-03 11:28:15 26 4
gpt4 key购买 nike

我正在学习Rust,但是找不到这个问题的答案。

在PHP中,有array_column方法,它的工作方式如下:

给定一个数组数组(这将是Rust中的vector的Vector):

$records = [
[1,2,3],
[1,2,3],
[1,2,3],
[1,2,3]
];

如果我想获得一个包含内部数组的所有首个元素(“列”)的数组,我可以这样做:
$column = array_column($records, 0);

这样,例如,我得到 [1,1,1,1]。如果将0更改为1,则得到 [2,2,2,2],依此类推。

由于Rust中没有 array_column等效项(也就是说:我找不到),用向量向量实现类似行为的最佳方法是什么?

最佳答案

正如您在评论中所尝试的那样,我决定使用迭代器。

此版本适用于任何可克隆的值(包括数字)。我们遍历子向量,对于每个子向量,我们都调用get方法,如果我们超出范围,则该方法将生成向量Some(&e)None的元素。

然后and_then接受get的值,如果它是None,则返回None,否则,如果它是Some(&e),则返回Some(e.clone()),即我们克隆了该值(因为我们只引用了get的值,所以我们可以' t存储它,我们必须复制值)。

然后collectIter<Option<T>>一起使用,并方便地将其转换为Option<Vec<T>>,即如果迭代器中有一些None(这意味着某些数组的大小不够大),它将返回None,或者如果一切都很好,则返回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()
}

关于rust - 在Rust中实现PHP array_column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61659684/

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