【问题标题】:How can I zip together an unknown-at-compile-time number of iterators?如何将编译时未知数量的迭代器压缩在一起?
【发布时间】:2019-08-12 23:43:29
【问题描述】:

我有许多由用户输入指定的 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? 只回答编译时知道迭代器数量的情况。

我可以使用索引等解决我的特定问题,感觉应该有更好的方法。

【问题讨论】:

  • 假设ManyZip存在,它应该如何实现Iterator——它应该产生Ts,还是Vec&lt;T&gt;s,还是impl Iterator&lt;Item=T&gt;s?
  • iterators: Vec&lt;T&gt; — 您希望能够只接受所有完全相同类型的迭代器向量?
  • 采用迭代器的(可能拥有的)迭代器并让 next() 返回一个迭代器会很好,但我无法计算出假设函数签名上的类型,因为我正在编写问题。

标签: rust iterator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2011-04-28
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多