#iterator #zip #tuple

multizip

将 3, 4, 5 或更多 Rust 迭代器打包

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2015年5月25日

#2673Rust 模式

Download history 27/week @ 2024-03-29 13/week @ 2024-04-05 6/week @ 2024-04-12 1/week @ 2024-04-19 5/week @ 2024-04-26 16/week @ 2024-05-03 48/week @ 2024-05-10 10/week @ 2024-05-17 20/week @ 2024-05-24 41/week @ 2024-05-31 52/week @ 2024-06-07 18/week @ 2024-06-14 8/week @ 2024-06-21 5/week @ 2024-06-28 45/week @ 2024-07-05 26/week @ 2024-07-12

85 每月下载量

MIT 许可证

17KB
335

multizip

将 3, 4, 5 或更多 Rust 迭代器打包


描述

使用 Rust 的 stdlib,一次只能打包 2 个迭代器

let a: Vec<i8> = vec![0, 1, 2];
let b: Vec<i8> = vec![3, 4, 5];
let c: Vec<i8> = vec![6, 7, 8];
let d: Vec<i8> = vec![9, 10, 11];

let abc = a.iter().zip(b.iter()).zip(c.iter())
           .map(|((&aa, &bb), &cc)| aa+bb+cc);
//               ((   ,    ),    )
//               ^~~~~~~~~~^~~~~~^ awkward!

let abcd = a.iter().zip(b.iter()).zip(c.iter()).zip(d.iter())
           .map(|(((&aa, &bb), &cc), &dd)| aa+bb+cc+dd);
//               (((   ,    ),    ),    )
//               ^~~~~~~~~~~^~~~~~^~~~~~^ ughhh!

使用 multizip,你可以获得 zip 的扁平化版本

let abc = multizip::zip3(a.iter(),
                         b.iter(),
                         c.iter())
         .map(|(&aa, &bb, &cc)| aa+bb+cc))
//             (   ,    ,    )
//             ^~~~~~~~~~~~~~^ oooh!

let abcd = multizip::zip4(a.iter(),
                          b.iter(),
                          c.iter(),
                          d.iter())
         .map(|(&aa, &bb, &cc, &dd)| aa+bb+cc+dd)
//             (   ,    ,    ,    )
//             ^~~~~~~~~~~~~~~~~~~^ sweet!

如何使用

TODO:上传到 crates.io 并在此处更新 Cargo 指令。

常见问题解答

我可以将多少个变量打包在一起?

Rust 支持在单个元组中最多 12 个变量,因此实现了以下功能: zip2()zip3()zip4()..., zip12()

如果你需要超过 12 个,那么可能你的设计有问题。考虑使用比元组更合适的东西。

multizip::zip2()std::iter::zip() 相比有什么优势?

唯一的优势是参数的对称性,例如 zip2(a.iter(), b.iter())a.iter().zip(b.iter())

作者

Marc Dupont -- mdup.fr

无运行时依赖