3个版本
0.1.2 | 2022年6月14日 |
---|---|
0.1.1 | 2022年6月14日 |
0.1.0 | 2022年6月14日 |
#2325 in 算法
8KB
127 行
EzIter
简化迭代器使用
用法
将此行添加到您的Cargo.toml
eziter = "0.1"
并在每个模块顶部添加使用声明EzIter
use eziter::*;
这是什么?
该crate包含围绕Rust迭代器和std集合的一些便利包装。
这些在您只想在迭代器上使用单个map或filter而无需展开完整x.iter().map(f).collect();
时非常有用。您可以将代码改为更简洁的x.map(f);
实际上只实现了少数方法,未来可能还会更多
x.map(f);
x.filter(f);
x.filter_map(f);
x.skip_while(f);
x.take_while(f);
x.map_while(f);
每个方法都有3种风味,以下是一个使用map
的例子
x.into_map(f);
x.map(f);
x.map_mut(f);
对应于
x.into_iter().map(f).collect();
x.iter().map(f).collect();
x.iter_mut().map(f).collect();
您可以直接使用这些包装器与标准集合一起使用,
HashMap<K, V>
BTreeMap<K, V>
HashSet<K>
BTreeSet<K>
BinaryHeap<T>
LinkedList<T>
Vec<T>
VecDeque<T>
但请注意,这些*_mut()
变体不适用于
HashSet<K>
BTreeSet<K>
BinaryHeap<T>
您还可以使用所有into_*()
包装器,这些包装器适用于所有实现IntoIterator
示例
use eziter::*;
fn main() {
let v = vec![1, 2, 3];
let _res: Vec<_> = v.map(|x| x + 3);
}
注意事项
请注意,这些包装器并非免费提供。
没有链式调用
首先,您将失去链式调用这些调用的能力。我的意思是,您可以链式调用,但它们都会单独调用.collect()
方法,随着链的增长,您将浪费越来越多的资源。在这种情况下,显然应该使用Rust的迭代器。
额外的Box<>
分配
为了使实现可行,只有 into_*()
包装器真正免费,其他产生的迭代器都被包装在 Box<dyn Iterator>
中。如果你不介意额外的分配/释放,那么一切正常。在未来,当 Rust 允许从特实现中返回 impl
时,这可能会改变。