¿Cuál es la forma más idiomática de trabajar con un iterador de resultados?

Tengo un 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<_>, _>>()

En términos de semántica, quiero detener el procesamiento después del primer error.

El código anterior funciona, pero se siente bastante engorroso. ¿Hay una mejor manera? He buscado en los documentos algo comofilter_if_ok, pero no he encontrado nada.

Estoy consciente decollect::<Result<Vec<_>, _>>y funciona muy bien Estoy tratando específicamente de eliminar la siguiente plantilla:

En el cierre del filtro, tengo que usarmatch enthing_result. Siento que esto debería ser una frase, por ejemplo.filter_if_ok(|thing| check(a)).Cada vez que usomap, Tengo que incluir una declaración extralet a = try!(thing_result); para hacer frente a la posibilidad de unErr. Nuevamente, siento que esto podría resumirse en.map_if_ok(|thing| ...).

¿Hay otro enfoque que pueda usar para obtener este nivel de concisión, o solo necesito resistirlo?

Respuestas a la pregunta(4)

Su respuesta a la pregunta