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