为了账号安全,请及时绑定邮箱和手机立即绑定

当Iterator :: map返回Result :: Err时,如何停止迭代并返回错误?

当Iterator :: map返回Result :: Err时,如何停止迭代并返回错误?

慕码人8056858 2019-09-24 15:37:29
我有一个函数返回一个Result:fn find(id: &Id) -> Result<Item, ItemError> {    // ...}然后另一个像这样使用它:let parent_items: Vec<Item> = parent_ids.iter()    .map(|id| find(id).unwrap())    .collect();如何处理任何map迭代中的失败情况?我知道我可以使用flat_map,在这种情况下,错误结果将被忽略:let parent_items: Vec<Item> = parent_ids.iter()    .flat_map(|id| find(id).into_iter())    .collect();Result的迭代器根据成功状态有0或1个项目,flat_map如果为0 ,则会将其过滤掉。但是,我不想忽略错误,而是想使整个代码块停止并返回一个新错误(基于映射内出现的错误,或者仅转发现有错误)。如何在Rust中最好地解决这个问题?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

此答案与Rust的1.0之前版本有关,并且删除了所需的功能


您可以std::result::fold为此使用功能。遇到第一个后,它将停止迭代Err。


我刚刚编写的示例程序:


fn main() {

  println!("{}", go([1, 2, 3]));

  println!("{}", go([1, -2, 3]));

}


fn go(v: &[int]) -> Result<Vec<int>, String> {

    std::result::fold(

        v.iter().map(|&n| is_positive(n)),

        vec![],

        |mut v, e| {

            v.push(e);

            v

        })

}


fn is_positive(n: int) -> Result<int, String> {

    if n > 0 {

        Ok(n)

    } else {

        Err(format!("{} is not positive!", n))

    }

}

输出:


Ok([1, 2, 3])

Err(-2 is not positive!)


查看完整回答
反对 回复 2019-09-24
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您可以应用相同的技巧。密钥位于的类型签名中collect,该类型在返回类型上是多态的,必须实现FromIterator。我不知道您的意思是“可以更广泛地应用它”。Rust支持多态返回类型...那么,是吗?(有关返回类型多态性的更多示例,请参见Rngand Defaulttrait。)

查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 584 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信