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