9 个版本
0.3.0 | 2023 年 5 月 22 日 |
---|---|
0.2.1 |
|
0.2.0 | 2019 年 3 月 10 日 |
0.1.6 | 2018 年 12 月 10 日 |
0.1.2 | 2016 年 7 月 20 日 |
#36 in 算法
2,494,536 每月下载量
在 2,572 个crate中使用 (直接使用 86)
88KB
2.5K SLoC
rust-fallible-iterator
"fallible" 迭代器用于 Rust。
特性
如果启用了 std
或 alloc
功能,此 crate 为 Box
、Vec
、BTreeMap
和 BTreeSet
提供实现。如果启用了 std
功能,此 crate 还提供了 HashMap
和 HashSet
的实现。
如果禁用了 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
特性上的附加方法在处理这些类型的迭代器时不会正确执行。例如,如果想要计算 Read
er 中的文本行数,这可能会是这样进行的
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());