如何在 Rust 中划分结果向量?

Won*_*Hau 7 rust

基本上,我正在寻找Rust 中的partitionEithers等效项,即转换Vec<Result<A, B>>Result<Vec<A>, Vec<B>>.

我知道我可以通过使用将 a 转换Vec<Result<A, B>>为,但是当我尝试时,我会收到一条错误消息,指出缺少此类实现。Result<Vec<A>, B>collect::<Result<Vec<A>, B>>collect::<Result<Vec<A>, Vec<B>>>

我也知道这可以使用突变来完成,但我想知道是否有任何我可以研究的不可变替代方案?

Sta*_*eur 11

您可以使用以下方法进行分区partition(),根据您的具体情况,使用partition_map()itertools 中的方法:

use itertools::{Either, Itertools};
fn main() {
    let successes_and_failures = vec![Ok(1), Err(false), Err(true), Ok(2)];

    let (successes, failures): (Vec<_>, Vec<_>) =
        successes_and_failures
            .into_iter()
            .partition_map(|r| match r {
                Ok(v) => Either::Left(v),
                Err(v) => Either::Right(v),
            });

    assert_eq!(successes, [1, 2]);
    assert_eq!(failures, [false, true]);
}
Run Code Online (Sandbox Code Playgroud)