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

问题描述 投票:0回答:2

您将如何遍历列表并过滤掉响应

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
2个回答
5
投票

如果您想要

Ok
中包含的值,请使用
Iterator::flat_map
,它将可迭代值组合到一个迭代器中。
Option
Result
都实现了
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
;它已经是前奏的一部分了


0
投票

不确定这是否仍然相关,但也许你想要这样的东西

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

如果出现错误,

ok()
将返回
None
然后被过滤掉。
Ok(T)
值被转换为原始
T
。所以最后,你会得到一个
Vec<T>

© www.soinside.com 2019 - 2024. All rights reserved.