【问题标题】:How do I filter out an iterator's values where calling a function returns a Result::Err?如何在调用函数返回 Result::Err 时过滤掉迭代器的值?
【发布时间】:2018-05-01 16:51:53
【问题描述】:

您将如何遍历列表并过滤掉响应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);
}

【问题讨论】:

    标签: filter rust pattern-matching


    【解决方案1】:

    如果您想要Ok 中包含的值,请使用Iterator::flat_map,它将可迭代值组合到一个迭代器中。 OptionResult 都实现了IntoIterator

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

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

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

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

    【讨论】:

    • 这很接近,但我想要原始值。有没有办法做到这一点?
    • @Rob 我不关注。 matching 的期望值是多少?如果你在你的问题中包含了这样的内容,我就可以避免浪费你的时间了。
    • 谢谢你的帮助,你绝对没有浪费我的时间
    猜你喜欢
    • 2014-12-09
    • 2015-02-23
    • 2018-12-23
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多