You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中处理Result<T>类型的迭代器?

处理Result迭代器的链式调用方案

标准库原生支持

Rust标准库已经覆盖了核心需求场景:

  • 终止迭代并返回错误:用try_for_each替代for循环,遇到第一个错误就停止并返回该错误:
    it.try_for_each(|x| {
        let xx = x?;
        // 编写xx的处理逻辑
        Ok(())
    })?;
    
  • 收集结果:直接调用collect,可将Iterator<Item=Result<T, E>>转换为Result<Vec<T>, E>,遇到错误立即终止并返回:
    let collected: Result<Vec<_>, _> = it.collect();
    let xx_list = collected?;
    // 处理收集到的xx_list
    
  • 自定义累积逻辑:用try_fold实现复杂的累积操作,同样遇到错误就中断迭代:
    let total = it.try_fold(0, |acc, x| {
        let xx = x?;
        Ok(acc + xx)
    })?;
    

第三方库方案

如果需要完整的链式迭代器方法(如带错误处理的map、filter),可以使用fallible-iterator crate,它专门为返回Result的迭代器设计了一套扩展方法:

  1. 添加依赖到Cargo.toml:
    [dependencies]
    fallible-iterator = "0.3"
    
  2. 使用示例:
    use fallible_iterator::FallibleIterator;
    
    it.into_fallible()
        // map自动处理Result,闭包直接接收T类型
        .map(|xx| Ok(transform_xx(xx)))
        // for_each遇到错误立即返回
        .for_each(|yy| {
            process_yy(yy);
            Ok(())
        })?;
    

自行实现扩展

如果不想引入第三方依赖,可以手动实现一个简单的扩展trait,封装错误处理逻辑:

// 为Result迭代器提供扩展方法
trait ResultIterExt<T, E>: Iterator<Item = Result<T, E>> + Sized {
    // 类似map,但自动处理Result,返回Result<U, E>迭代器
    fn ok_map<U, F>(self, f: F) -> OkMap<Self, F>
    where
        F: FnMut(T) -> U,
    {
        OkMap { iter: self, f }
    }

    // 类似for_each,遇到错误返回Result<(), E>
    fn ok_for_each<F>(mut self, mut f: F) -> Result<(), E>
    where
        F: FnMut(T),
    {
        while let Some(item) = self.next() {
            f(item?);
        }
        Ok(())
    }
}

// 为所有Result迭代器实现该trait
impl<I, T, E> ResultIterExt<T, E> for I where I: Iterator<Item = Result<T, E>> {}

// ok_map返回的迭代器结构体
struct OkMap<I, F> {
    iter: I,
    f: F,
}

// 实现Iterator trait
impl<I, T, E, U, F> Iterator for OkMap<I, F>
where
    I: Iterator<Item = Result<T, E>>,
    F: FnMut(T) -> U,
{
    type Item = Result<U, E>;

    fn next(&mut self) -> Option<Self::Item> {
        self.iter.next().map(|res| res.map(&mut self.f))
    }
}

使用时即可链式调用:

it.ok_map(|xx| xx * 2)
  .ok_for_each(|yy| println!("{}", yy))?;

内容的提问来源于stack exchange,提问作者petersohn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:37:17