3个版本

0.1.2 2022年6月14日
0.1.1 2022年6月14日
0.1.0 2022年6月14日

#2325 in 算法

MIT许可证

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 时,这可能会改变。

依赖项