問題一覧に戻る
中級エラー処理
問題61: エラーの集約
複数のResultを集約して処理する方法です。collectはイテレータのResultをResultのコレクションに変換し、一つでもエラーがあればErrを返します。partitionで成功と失敗を分離できます。バッチ処理や検証処理で重要なパターンです。
fn main() {
let numbers = vec!["1", "2", "3"];
// Resultの集約
let parsed: Result<Vec<i32>, _> = numbers
.iter()
.map(|s| s.parse::<i32>())
.();
println!("{:?}", parsed);
let mixed = vec!["1", "bad", "3"];
// エラーケース
let result: <Vec<i32>, _> = mixed
.iter()
.map(|s| s.parse::<i32>())
.collect();
println!("{:?}", result);
// Resultの分割
let results: Vec<Result<i32, _>> = vec![
Ok(1), Err("err1"), Ok(2), Err("err2")
];
let (oks, errs): (Vec<_>, Vec<_>) = results
.into_iter()
.();
println!("Ok: {:?}, Err: {:?}", oks, errs);
}