banner
davirain

davirain

twitter
github
知乎
twitter

Vec<Result<T>, E>をResult<Vec<T>, E>に変換する

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) を返します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。