10 个版本

0.1.9 2023年1月6日
0.1.8 2022年10月12日
0.1.7 2022年9月8日
0.1.6 2022年6月29日
0.1.2 2016年12月11日

#72 in 算法

Download history 28124/week @ 2024-04-21 22850/week @ 2024-04-28 25014/week @ 2024-05-05 26031/week @ 2024-05-12 25934/week @ 2024-05-19 24672/week @ 2024-05-26 23839/week @ 2024-06-02 21785/week @ 2024-06-09 23289/week @ 2024-06-16 25258/week @ 2024-06-23 24027/week @ 2024-06-30 24992/week @ 2024-07-07 23183/week @ 2024-07-14 25386/week @ 2024-07-21 25469/week @ 2024-07-28 26199/week @ 2024-08-04

101,941 每月下载量
246 个 crate (26 个直接使用) 中使用

MIT/Apache

97KB
3K SLoC

streaming-iterator

CircleCI

文档

Rust 的流式迭代器。

许可

许可协议为以下之一

任选其一。

贡献

除非您明确表示,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可协议定义,应按上述方式双许可,不附加任何额外条款或条件。


lib.rs:

流式迭代器。

Rust 标准库中的迭代器 API 不允许产生从迭代器本身借用的元素。这意味着,例如,std::io::Lines 迭代器必须为每一行分配一个新的 String,而不是重用内部缓冲区。相反,StreamingIterator 特性通过引用而不是值提供对正在迭代的元素访问。

StreamingIterator 不能用于 Rust 的 for 循环,但 while let 循环提供了相似级别的易用性

while let Some(item) = iter.next() {
    // work with item
}

但是,请确保仅使用上述形式与现有迭代器的可变引用一起使用,而不是与创建迭代器的表达式一起使用。例如,以下代码将无限期地循环遍历数组的第一个元素

use streaming_iterator::{convert, StreamingIterator};
let array = [0, 1, 2, 3];

while let Some(item) = convert(array.iter()).next() {
  // This is an infinite loop!
}

虽然标准 Iterator 特性的功能基于 next 方法,但 StreamingIterator 的功能基于一对方法:advanceget。这实际上将 next 的逻辑分成两半(实际上,StreamingIteratornext 方法只是调用 advance 然后是 get)。

这是由于 Rust 对借用(特别是缺少单入口、多出口借用)的词法处理所必需的。如果 StreamingIterator 被定义为像 Iterator 一样,只有一个必需的 next 方法,那么像 filter 这样的操作将无法定义。

无运行时依赖

特性