如何在调用函数返回 Result::Err 时过滤掉迭代器的值?

Rob*_*Rob 3 filter pattern-matching rust

您将如何遍历列表并过滤掉响应Result不是的所有值Ok?我想做类似的事情filter_map,但它说我需要返回一个Option.

use std::result::Result;

fn match_value(vals: i32) -> Result<i32, i32> {
    match vals {
        2 => Ok(1),
        _ => Err(0),
    }
}

fn main() {
    let values = vec![1, 2, 3, 2];
    let matching = values
        .iter()
        .map(|name| match_value(*name))
        .filter(|x| x.is_ok())
        .collect::<Vec<_>>();
    println!("{:?}", matching);
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

如果您想要包含在 中的值Ok,请使用Iterator::flat_map,它将可迭代值组合成一个迭代器。Option并且Result都实现IntoIterator

let matching = values
    .iter()
    .flat_map(|name| match_value(*name))
    .collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)

如果您想要原始值,只需使用filter

let matching = values
    .iter()
    .filter(|&&name| match_value(name).is_ok())
    .collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)

无需导入Result;它已经是前奏的一部分。