1 个不稳定版本

0.1.0 2019年11月22日

#3#happen

每月下载 33

MIT 许可证

23KB
95

ResultIt

Rust 迭代器返回 Option<Item>,但如果 Item 是可能返回 ErrResult 呢?这个 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() 返回 Nonewhile let 循环结束。通常,你会使用更符合语法的结构 for i in vecfor i in iteriter.for_each(|i| println!("{}", i),并且 Option<Item> 将自动展开。

众所周知,编程中并非所有事情都会按计划进行。这个包就是为了帮助处理 Item 是可能包含 ErrResult 的情况。

  • 平铺结果迭代器,请参阅 FlattenResultsflatten_results()
  • 平铺或删除嵌套结果迭代器中的错误类型,请参阅 TryError
  • 在第一次错误后停止迭代,请参阅 StopAfterErrorstop_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?))
	});

无运行时依赖