Vec<Result<T, E>> を Result<Vec, E > に変換するには、Iterator トレイトの try_fold () メソッドを使用することができます。以下に例の実装を示します。
ここでは、into_iter () を使用して Vec をイテレータに変換します。そして、try_fold () を呼び出し、Vec::new () を初期値として、2 つの引数(アキュムレータである acc と Result である res)を取るクロージャを渡します。
fn vec_result_to_result_vec<T, E>(v: Vec<Result<T, E>>) -> Result<Vec<T>, E> {
v.into_iter().try_fold(Vec::new(), |mut acc, res| {
match res {
Ok(t) => {
acc.push(t);
Ok(acc)
},
Err(e) => Err(e)
}
})
}
クロージャのパターンは、Result のバリアントにマッチし、Ok の値を acc ベクタに追加して Ok (acc) を返します。もし Result が Err である場合は、Err (e) を返します。try_fold () メソッドは、イテレータの残りのアイテムを繰り返し処理し、更新されたアキュムレータの値を各クロージャの呼び出しに渡します。
元の Vec の中に Err がある場合、try_fold () はショートサーキットされ、最初にエラーが発生した場合にはその Err を返します。それ以外の場合は、アンラップされた T の値の Vec である Ok (acc) を返します。