Qual é a maneira mais idiomática de trabalhar com um Iterador de Resultados?

Eu tenho um código como este:

let things = vec![/* ...*/]; // e.g. Vec<String>
things
    .map(|thing| {
        let a = try!(do_stuff(thing));
        Ok(other_stuff(a))
    })
    .filter(|thing_result| match *thing_result {
        Err(e) => true,
        Ok(a) => check(a),
    })
    .map(|thing_result| {
        let a = try!(thing_result);
        // do stuff
        b
    })
    .collect::<Result<Vec<_>, _>>()

Em termos de semântica, desejo interromper o processamento após o primeiro erro.

O código acima funciona, mas parece bastante complicado. Existe uma maneira melhor? Procurei nos documentos algo comofilter_if_ok, mas não encontrei nada.

Estou cientecollect::<Result<Vec<_>, _>>e funciona muito bem. Estou especificamente tentando eliminar o seguinte padrão:

No fechamento do filtro, eu tenho que usarmatch emthing_result. Eu sinto que isso deve ser apenas uma linha, por ex..filter_if_ok(|thing| check(a)).Toda vez que eu usomap, Eu tenho que incluir uma declaração extralet a = try!(thing_result); para lidar com a possibilidade de umErr. Mais uma vez, sinto que isso poderia ser abstraído para.map_if_ok(|thing| ...).

Existe outra abordagem que eu possa usar para obter esse nível de concisão, ou eu só preciso resistir?

questionAnswers(4)

yourAnswerToTheQuestion