2015-04-16 13 views
16

Có cách trực tiếp hơn và có thể đọc được để thực hiện những điều sau:Làm cách nào để tôi có thể nén nhiều hơn hai trình lặp?

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

Đó là, làm thế nào tôi có thể xây dựng một iterator từ n iterables trong đó sản lượng n-tuples?

Trả lời

20

Bạn có thể sử dụng multizip từ thùng itertools, mà thực hiện điều này cho 1- 8-tuples:

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

} 

Bạn sẽ phải thêm một sự phụ thuộc vào itertools trong Cargo.toml, sử dụng bất cứ phiên bản nào là muộn nhất. Ví dụ:

[dependencies] 
itertools = "0.6.1" 
+0

Tôi thích. Chấp nhận ngay bây giờ trừ khi ai đó có thứ gì đó từ 'std' – anderspitman

+0

Bạn có thể giải nén một trong số này và nhận một bộ sưu tập không? –

+0

Có, xem .unzip() trên 'Iterator' (chỉ bao gồm trường hợp cặp đôi). – bluss

Các vấn đề liên quan