2015-04-16 24 views
16

Czy jest bardziej bezpośredni i czytelny sposób, aby wykonać następujące czynności:Jak mogę skompresować więcej niż dwa iteratory?

let a = [1,2,3]; 
let b = [4,5,6]; 
let c = [7,8,9]; 
let iter = a.iter().zip(b.iter()).zip(c.iter()).map(|((x,y), z)| (x,y,z)); 

To, w jaki sposób można budować iterator z N iterables co przynosi n-krotki?

Odpowiedz

20

Można użyć multizip od skrzyni itertools, który realizuje to dla 1- do 8-krotek:

extern crate itertools; 
use itertools::multizip; 

fn main() { 

    let a = [1,2,3]; 
    let b = [4,5,6]; 
    let c = [7,8,9]; 

    // multizip accepts iterators and/or values with IntoIterator. 
    for (x, y, z) in multizip((&a, &b, &c)) { 
    } 

} 

Trzeba by dodać zależność od itertools w Cargo.toml, wykorzystania niezależnie od wersji jest najnowszy. Przykład:

[dependencies] 
itertools = "0.6.1" 
+0

Podoba mi się. Akceptuję na razie, chyba że ktoś ma coś z 'std'a – anderspitman

+0

Czy możesz rozpakować jedną z nich i zdobyć krotkę kolekcji? –

+0

Tak, zobacz .unzip() na 'Iterator' (tylko obejmuje przypadku pary). – bluss

Powiązane problemy