2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2015 年 4 月 19 日 |
---|---|
0.1.0 | 2015 年 4 月 19 日 |
在 #zipping 中排名 3
每月下载 45 次
3KB
zipWith.rs
标准库在 std::iter
模块中提供了几种迭代集合的方案。其中包含 Zip
和 Map
迭代器,但是没有 ZipWith
。
看起来你应该能够非常简单地实现一个 zip_with
函数,例如这样
fn zipWith<R, U: Iterator, C: Fn(U::Item, U::Item) -> R> (combo: C, left: U, right: U) -> ??? {
left.zip(right).map(| (l, r) | combo(l, r))
}
但是,返回类型应该是什么?在 Rust 中抽象返回类型到来之前,我们无法返回 impl Iterator<R>
,我们只能返回一个具体实现的迭代器 -- 在这种情况下,我们会返回一个 Map
。
我认为这很丑!类型应该传达函数的意图,而 zip_with
的意图(不仅是)返回 Map
。
因此,这个库公开了一个名为 ZipWith
的结构,它包含两个迭代器和用于组合元素的闭包,以及一个名为 IntoZipWith
的特质(在 std::iter::IntoIterator
的意义上)来公开 zip_with
函数。
你可以这样使用它 像这样
use zipWith::IntoZipWith;
use std::iter::Iterator;
#[test]
fn zipping_two_lists_of_numbers_with_plus_returns_their_sum () {
let left: Vec<u8> = vec![1, 2, 3];
let right: Vec<u8> = vec![4, 5, 6];
let result: Vec<u8> = left.zip_with(right, | l, r | l + r).collect();
assert_eq!(vec![5, 7, 9], result);
}