Какой самый идиоматический способ работы с Итератором результатов? У меня есть код:Ржавчина: фильтрация и отображение итератора результатов
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| ...)
.
Есть ли другой подход, который я могу использовать для получения этого уровня лаконичности, или мне просто нужно его выкрутить?
http://stackoverflow.com/questions/26368288/dealing-with-result-within-iter? – ArtemGr