1 个不稳定版本
0.1.0 | 2019年11月22日 |
---|
#3 在 #happen
每月下载 33 次
23KB
95 行
ResultIt
Rust 迭代器返回 Option<Item>
,但如果 Item
是可能返回 Err
的 Result
呢?这个 crate 提供了迭代器适配器,以简化处理所谓的“可能失败”的迭代器。提供的适配器彼此独立;您可以使用整个 crate,使用 use resultit::*;
或仅使用您想要的迭代器适配器特性(例如使用 use resultit::FlattenResults
)。您还可以自由地取单个文件(例如 flatten_results.rs)并在自己的源树中使用它们,而不依赖于此 crate。有关更多信息示例,请参阅文档。
背景
Rust 迭代器实现了返回 Option<Item>
的函数 next(),其中 Item
是迭代器遍历的类型。例如
let v: Vec<i32> = vec![1, 2, 3];
let iter = v.into_iter(); // satisfies trait bound Iterator<Item=i32>
while let Some(i) = iter.next() {
println!("{}", i); // i has type i32
}
// Output:
// 1
// 2
// 3
在上面的稍微有些人为的例子中,iter
是对向量 v
的迭代器,并满足特质约束 Iterator<Item=i32>
。当 iter.next()
返回 Some(i)
(其中 i
是向量中的下一个整数)时,while let
语句会一直执行。当 iter.next()
返回 Some(3)
后,下一次调用 iter.next()
返回 None
,while let
循环结束。通常,你会使用更符合语法的结构 for i in vec
或 for i in iter
或 iter.for_each(|i| println!("{}", i)
,并且 Option<Item>
将自动展开。
众所周知,编程中并非所有事情都会按计划进行。这个包就是为了帮助处理 Item
是可能包含 Err
的 Result
的情况。
- 平铺结果迭代器,请参阅
FlattenResults
和flatten_results()
- 平铺或删除嵌套结果迭代器中的错误类型,请参阅
TryError
- 在第一次错误后停止迭代,请参阅
StopAfterError
和stop_after_error()
有关如何使用上述每个工具的详细信息,请参阅 rustdoc 文档。
示例
在 文档 中有多个教学示例。下面是一个使用 glob 包的真实世界示例。
// Use the resultit crate.
use resultit::*;
// Look for image files with different extensions.
let glob_patterns = vec!["*.png", "*.jpg"];
// Print out a list of matching image files.
glob_patterns.into_iter()
// Attempt to convert each glob pattern into an iterator over matching paths.
.map(|pattern| -> glob::glob(&pattern))
// Flatten over each inner iterator over matching paths.
.flatten_results()
// Flatten/erase the nested error types PatternError and GlobError.
.map(|path| -> lib::TryResult<_> { Ok(path??) })
// Stop iteration after the first error is encountered.
.stop_after_error()
// Generate some output, propagating errors up the stack.
.try_for_each(|path| -> TryResult<()> {
Ok(println!("Found image: {:?}", path?))
});