如何在编译时将未知数量的迭代器压缩在一起?

时间:2019-03-22 02:20:05

标签: rust iterator

我有多个Rust迭代器,这些迭代器是由用户输入指定的,我想一步一步地进行迭代。

这听起来像是Iterator::zip之类的工作,除了我可能需要将两个以上的迭代器压缩在一起。我查看了itertools::multizipitertools::izip,但是它们都要求在编译时知道要压缩的迭代器的数量。对于我的任务,要压缩在一起的迭代器的数量取决于用户的输入,因此在编译时无法知道。

我一直希望像Python's zip function这样的东西能够迭代。我想函数签名可能看起来像:

fn manyzip<T>(iterators: Vec<T>) -> ManyZip<T>
where
    T: Iterator

How can I zip more than two iterators?仅针对在编译时已知迭代器数量的情况进行回答。

我可以使用索引来解决自己的特殊问题,这样看来,应该有更好的方法。

1 个答案:

答案 0 :(得分:3)

实现您自己的迭代器,该迭代器遍历输入迭代器并收集它们:

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);
    }
}