Какой самый идиоматичный способ работы с итератором результатов?
У меня есть такой код:
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| ...)
.Есть ли другой подход, который я могу использовать, чтобы получить этот уровень краткости, или мне просто нужно проверить это?