我试图找到或实现一种适用于任何迭代器的方法,它允许我迭代所有元素,并为每个元素创建多个新元素,然后这些元素成为旧迭代器的一部分。这有效地增加了迭代器的大小。
首先,已经有一种方法可以做到这一点,但这对于我正在编写的程序来说是不可行的,因为这非常漫长且乏味,而且我会经常这样做。
//This is not the actual usecase, just example code
fn main() {
let numbers: Vec<i32> = vec![10, 20, 30];
//this bit here
let result_nums: Vec<i32> = Vec::new();
for num in number.iter() {
result_nums.push(num);
result_nums.push(num + 1);
result_nums.push(num + 2);
}
}
我需要的这段代码中的主要操作,for循环中的代码,它将
numbers
数组“扩展”为一个新数组result_nums
。
我想编写这段代码的方式如下:
fn main() {
let numbers: Vec<i32> = vec![10, 20, 30];
//this bit
let result: Vec<i32> = numbers.iter().expand(|x, container| -> {
container.push(x);
container.push(x + 1);
container.push(x + 2);
}).collect()
//the iterator will now contain the elements: [10, 11, 12, 20, 21, 22, 30, 31, 32]
}
这是我能想到的最符合人体工程学的方式。请记住,我将链接
expand()
操作,并且我不会在每一个操作之后进行收集,这只是为了示例。
这确实可以节省时间,而且不会那么冗长,因为我不必继续使用整个类型签名创建临时数组,也不必编写整个 for 循环。
如果有人知道可以执行此操作的板条箱或更好、更符合人体工程学的方式来编写这些扩展操作,请告诉我!
@user4815162342 建议使用标准库方法
flat_map
(https://doc.rust-lang.org/std/iter/struct.FlatMap.html),这使得这个精确的实现成为可能!