#iterator #continue #processing #try #would #elements #type

try-continue

允许处理 Result 类型的迭代器

1 个不稳定版本

0.1.0 2021年11月28日

#2086 in Rust 模式

Apache-2.0

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());

无运行时依赖