在每个元素的基础上增加迭代器的大小/扩展和映射迭代器

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

我试图找到或实现一种适用于任何迭代器的方法,它允许我迭代所有元素,并为每个元素创建多个新元素,然后这些元素成为旧迭代器的一部分。这有效地增加了迭代器的大小。

首先,已经有一种方法可以做到这一点,但这对于我正在编写的程序来说是不可行的,因为这非常漫长且乏味,而且我会经常这样做。

//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 循环。

如果有人知道可以执行此操作的板条箱或更好、更符合人体工程学的方式来编写这些扩展操作,请告诉我!

rust iterator
1个回答
0
投票

@user4815162342 建议使用标准库方法

flat_map
https://doc.rust-lang.org/std/iter/struct.FlatMap.html),这使得这个精确的实现成为可能!

© www.soinside.com 2019 - 2024. All rights reserved.