Как я могу объединить неизвестное число итераторов во время компиляции? - PullRequest
1 голос
/ 22 марта 2019

У меня есть несколько итераторов Rust, заданных пользовательским вводом, которые я хотел бы перебрать в lockstep.

Это звучит как работа для чего-то вроде Iterator::zip, за исключением того, что мне может понадобиться более двух итераторов, сжатых вместе. Я посмотрел на itertools::multizip и itertools::izip, но оба они требуют, чтобы число итераторов, которые нужно сжать, было известно во время компиляции. Для моей задачи количество итераторов, которые должны быть объединены в архив, зависит от пользовательского ввода и, следовательно, не может быть известно во время компиляции.

Я надеялся на что-то вроде Python zip функция , которая принимает итерируемые итерации. Я полагаю, подпись функции может выглядеть так:

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

Как мне сжать более двух итераторов? отвечает только за ситуацию, когда число итераторов известно во время компиляции.

Я могу решить свою конкретную проблему, используя индексы и прочее, мне кажется, что должен быть лучший способ.

1 Ответ

3 голосов
/ 22 марта 2019

Реализуйте свой собственный итератор, который перебирает входные итераторы и собирает их:

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