Какой самый идиоматичный способ работы с итератором результатов?

У меня есть такой код:

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

С точки зрения семантики, я хочу остановить обработку после первой ошибки.

Приведенный выше код работает, но кажется довольно громоздким. Есть ли способ лучше? Я просмотрел документы на что-то вродеfilter_if_ok, но я ничего не нашел.

Я в курсеcollect::<Result<Vec<_>, _>>и это прекрасно работает. Я специально пытаюсь устранить следующие шаблоны:

В закрытии фильтра я должен использоватьmatch наthing_result, Я чувствую, что это должно быть только одной строкой, например.filter_if_ok(|thing| check(a)).Каждый раз, когда я используюmapЯ должен включить дополнительное заявлениеlet a = try!(thing_result); для того, чтобы иметь дело с возможностьюErr, Опять же, я чувствую, что это может быть абстрагировано в.map_if_ok(|thing| ...).

Есть ли другой подход, который я могу использовать, чтобы получить этот уровень краткости, или мне просто нужно проверить это?

Ответы на вопрос(4)

Ваш ответ на вопрос