Как только у меня есть вектор итераторов, как я могу преобразовать его в итератор векторов?
Существует два способа создания итератора: использовать существующий адаптер итератора или реализовать собственный итератор.
Давайте возьмем второй подход и определим пользовательский тип Итератора, который принимает вектор итераторов:
struct DynamicZip<I>
where I: Iterator {
iterators: Vec<I>
}
, и давайте предоставим реализацию Итератора:
impl<I, T> Iterator for DynamicZip<I>
where I: Iterator<Item = T> {
type Item = Vec<T>;
fn next(&mut self) -> Option<Self::Item> {
let output: Option<Vec<T>> = self.iterators.iter_mut().map(|iter| iter.next()).collect()
output
}
}
ивсе готово!
Возвращаясь к исходному примеру
fn main() {
let array = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
let iterators: Vec<_> = array.into_iter().map(|v| v.into_iter()).collect();
let dz = DynamicZip { iterators: iterators };
// use the Iterator type we just defined
for column in dz {
println!("{:?}", column)
}
}
будет выдавать
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]