Как отфильтровать значения итератора, когда вызов функции возвращает Result :: Err? - PullRequest
0 голосов
/ 01 мая 2018

Как бы вы перебрали список и отфильтровали все значения, где ответ 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);
}

1 Ответ

0 голосов
/ 01 мая 2018

Если вы хотите, чтобы значение содержалось в 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; это уже часть прелюдии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...