Was ist die idiomatischste Art, mit einem Iterator of Results zu arbeiten?

Ich habe Code wie folgt:

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

us semantischer Sicht möchte ich die Verarbeitung nach dem ersten Fehler beenden.

Der obige Code funktioniert, fühlt sich aber ziemlich umständlich an. Gibt es einen besseren Weg? Ich habe in den Dokumenten nach so etwas wie @ gesuchfilter_if_ok, aber ich habe nichts gefunden.

Ich bin mir bewusst, dasscollect::<Result<Vec<_>, _>>, und es funktioniert super. Ich versuche speziell, das folgende Boilerplate zu beseitigen:

In den Verschluss des Filters muss ich @ verwendmatch aufthing_result. Ich denke, dies sollte nur ein Einzeiler sein, z..filter_if_ok(|thing| check(a)).mmer wenn ich @ benutmap, Ich muss eine extra Anweisung hinzufügenlet a = try!(thing_result); um mit der Möglichkeit eines @ umzugehErr. Auch hier habe ich das Gefühl, dass dies in @ abstrahiert werden könnt.map_if_ok(|thing| ...).

Ist es einen anderen Ansatz, mit dem ich dieses Prägnanzniveau erreichen kann, oder muss ich es nur herausfordern?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage