2015-04-16 12 views
16

C'è un modo più diretto e leggibile per realizzare il seguente:Come posso comprimere più di due iteratori?

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

Cioè, come posso costruire un iteratore da n iterables che produce n-uple?

risposta

20

È possibile utilizzare multizip dalla cassa itertools, che implementa questo per 1 a 8-tuple:

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

} 

Si dovrebbe aggiungere una dipendenza itertools in Cargo.toml, utilizzare qualsiasi versione è la più recente. Esempio:

[dependencies] 
itertools = "0.6.1" 
+0

Mi piace. Accettazione per ora a meno che qualcuno non abbia qualcosa da 'std' – anderspitman

+0

Puoi decomprimere uno di questi e ottenere una tupla di collezioni? –

+0

Sì, vedere .unzip() su 'Iterator' (copre solo il caso della coppia, però). – bluss

Problemi correlati