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:
match
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?