1 个不稳定版本
0.1.0 | 2021年11月28日 |
---|
#2086 in Rust 模式
10KB
90 行
try-continue
try-continue
提供了一种方法,try_continue
,允许您将类型为 Result<T, _>
的迭代器当作类型为 T
的迭代器来处理。这对于所有提供 Result
的迭代器来说都得到了实现。这在您需要映射到一个可能会出错的函数时特别有用,您希望继续使用迭代器 API 来处理元素,但仍然知道映射函数是否出错。
例如,考虑一个简单的解析器,您被提供一个整数字符串列表,您希望计算所有包含偶数的字符串。如果您只想使用迭代器 API,那么如果一个元素解析失败,传递 Result
可能会有些麻烦。更糟糕的是,这样做可能会阻止您使用诸如 Iterator::count
这样的方法,因为这实际上会尝试计数 Result
,迫使您重新实现计数,使用 Iterator::fold
。使用 try_continue
方法将允许您直接处理解析数字的迭代器。
use std::str::FromStr;
use try_continue::TryContinue;
fn count_even_number_strings(elements: &[&str]) -> Result<usize, <u8 as FromStr>::Err> {
elements
.iter()
.map(|&s| s.parse::<u8>())
.try_continue(|iter| iter.filter(|n| n % 2 == 0).count())
}
let num_evens_result = count_even_number_strings(&vec!["1", "2", "3", "24", "28"]);
assert_eq!(3, num_evens_result.unwrap());
let num_evens_bad_result = count_even_number_strings(&vec!["1", "2", "three", "-4", "28"]);
assert!(num_evens_bad_result.is_err());