如何在Rust中使用迭代器循环遍历不同长度的数组?
解决Rust中多长度向量循环迭代的问题
问题分析
你的代码无法运行有两个核心原因:
cycles是一次性消费的迭代器,无法在loop中重复使用Cycle迭代器的next()方法需要可变借用,但原代码中闭包里的迭代器是不可变的,无法调用next()
解决方案
我们需要把每个循环迭代器存入一个可变容器,每次循环通过可变引用调用next(),代码示例如下:
fn main() { let vectors = vec![ vec![0, 1], vec![2, 3, 4] ]; // 将每个向量转换为循环迭代器,并存入可变Vec let mut cycles: Vec<_> = vectors .into_iter() .map(|vec| vec.into_iter().cycle()) .collect(); loop { // 对每个循环迭代器取下一个元素 let output: Vec<_> = cycles .iter_mut() .map(|iter| iter.next().unwrap()) .collect(); println!("{:?}", output); // 可添加终止条件避免无限循环,比如循环指定次数后break // std::thread::sleep(std::time::Duration::from_secs(1)); } }
代码说明
- 使用
collect()将所有循环迭代器存入可变Vec,这样可以重复访问每个迭代器 iter_mut()为容器中的每个迭代器提供可变引用,满足next()方法对&mut self的要求- 这个写法天然支持任意k个向量的场景,不管向量长度是否一致,都会循环取出每个向量的元素
运行结果
执行后会按预期输出:
[0, 2] [1, 3] [0, 4] [1, 2] [0, 3] [1, 4] ...
内容的提问来源于stack exchange,提问作者Luís Assunção
相关产品推荐
相关产品推荐

