9 个版本

0.3.0 2023 年 5 月 22 日
0.2.1 2018 年 12 月 10 日
0.2.0 2019 年 3 月 10 日
0.1.6 2018 年 12 月 10 日
0.1.2 2016 年 7 月 20 日

#36 in 算法

Download history 587082/week @ 2024-04-23 548561/week @ 2024-04-30 569736/week @ 2024-05-07 589221/week @ 2024-05-14 588050/week @ 2024-05-21 633342/week @ 2024-05-28 597387/week @ 2024-06-04 613801/week @ 2024-06-11 593481/week @ 2024-06-18 609924/week @ 2024-06-25 567398/week @ 2024-07-02 611468/week @ 2024-07-09 620409/week @ 2024-07-16 636456/week @ 2024-07-23 602214/week @ 2024-07-30 525528/week @ 2024-08-06

2,494,536 每月下载量
2,572 个crate中使用 (直接使用 86)

MIT/Apache

88KB
2.5K SLoC

crates.io docs.rs

Continuous integration

rust-fallible-iterator

"fallible" 迭代器用于 Rust。

特性

如果启用了 stdalloc 功能,此 crate 为 BoxVecBTreeMapBTreeSet 提供实现。如果启用了 std 功能,此 crate 还提供了 HashMapHashSet 的实现。

如果禁用了 std 功能,此 crate 不依赖于 libstd


lib.rs:

"可出错" 迭代器。

Rust 标准库中的迭代器 API 不支持以一等公民方式可失败迭代的操作。这些迭代器通常被建模为遍历 Result<T, E> 值;例如,Lines 迭代器返回 io::Result<String>。当简单地遍历这些类型时,必须在某些方式下解包迭代值才能使用它

for line in reader.lines() {
    let line = line?;
    // work with line
}

此外,许多在 Iterator 特性上的附加方法在处理这些类型的迭代器时不会正确执行。例如,如果想要计算 Reader 中的文本行数,这可能会是这样进行的

let count = reader.lines().count();

当读取器操作成功时,这将返回正确的值,但如果遇到 IO 错误,结果可能略高于预期(如果错误是瞬时的),或者如果错误被重复返回,它可能会无限期地运行!

相比之下,易出错的迭代器建立在调用 next 可能会失败的概念之上。除了 Item 类型外,该特质还有一个额外的 Error 关联类型,并且 next 返回 Result<Option<Self::Item>, Self::Error> 而不是 Option<Self::Item>。像 count 这样的方法也会返回 Result

这意味着易出错的迭代器与 Rust 的 for 循环语法不兼容,但 while let 循环提供了类似的人体工程学水平。

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

易出错的闭包参数

Iterator 一样,许多 FallibleIterator 方法接受闭包作为参数。这些闭包使用与它们的 Iterator 对应者相同的签名,只不过 FallibleIterator 预期闭包是易出错的:它们返回 Result<T, Self::Error> 而不是简单的 T

例如,标准库的 Iterator::filter 适配器方法根据用户提供的谓词过滤底层迭代器,其返回类型为 bool。然而,在 FallibleIterator::filter 中,谓词返回 Result<bool, Self::Error>

let numbers = convert("100\n200\nfern\n400".lines().map(Ok::<&str, Box<Error>>));
let big_numbers = numbers.filter(|n| Ok(u64::from_str(n)? > 100));
assert!(big_numbers.count().is_err());

无运行时依赖

特性