我有一些由用户输入指定的Rust迭代器,我想在锁步中迭代。
这听起来像Iterator::zip
之类的工作,除了我可能需要两个以上的迭代器压缩在一起。我查看了itertools::multizip
和itertools::izip
,但这些都要求在编译时知道要压缩的迭代器数量。对于我的任务,要压缩在一起的迭代器数量取决于用户输入,因此在编译时无法知道。
我希望像Python's zip
function这样的东西可以迭代迭代。我想函数签名可能看起来像:
fn manyzip<T>(iterators: Vec<T>) -> ManyZip<T>
where
T: Iterator
How can I zip more than two iterators?只解答在编译时已知迭代器数量的情况。
我可以使用索引等解决我的特殊问题,它只是觉得应该有更好的方法。
实现自己的迭代器迭代输入迭代器并收集它们:
struct Multizip<T>(Vec<T>);
impl<T> Iterator for Multizip<T>
where
T: Iterator,
{
type Item = Vec<T::Item>;
fn next(&mut self) -> Option<Self::Item> {
self.0.iter_mut().map(Iterator::next).collect()
}
}
fn main() {
let mz = Multizip(vec![1..=2, 10..=20, 100..=200]);
for v in mz {
println!("{:?}", v);
}
}