нужно либо отбросить ее, либо определить в одну из двух групп и распарсить, результаты собрать в два вектора. Пока получился такой код:
let (as, bs): (Vec<_>, Vec<_>) = strings
.iter()
.filter_map(|string|
match string {
«a» => Some(Either::Left(Parser::parse(&attr))),
«b» => Some(Either::Right(Parser::parse(&attr))),
_ => None
}
)
.partition(Either::is_left);
Проблема в том, что я хочу в итоге иметь Result<Vec<Parsed>, ParseError>, а получается Vec<Either<Result<Parsed, ParseError>>>. Знаю что можно собирать итератор из резалтов в резалт от коллекции, но partition требует Default, которого у Result нету. Вторая проблема что Either не разворачивается при сборке. Есть идеи какую комбинацию комбинаторов использовать?
let (mut as, mut bs) = (vec![], vec![]); for s in &strings { match s { "a" => as.push(...), "b" => bs.push(...), ... } } ?
try_fold, может?
fn main() { let strings = ["a", "b", "a", "b", "c", "c"]; let (a, b) = strings .iter() .fold((Vec::new(), Vec::new()), |(mut a, mut b), x| { match *x { "a" => a.push(x), "b" => b.push(x), _ => {} } (a, b) }); println!("{:?} {:?}", a, b); }
Обсуждают сегодня