猿问

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

我有一个函数返回一个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中最好地解决这个问题?


慕码人8056858
浏览 614回答 3
3回答

阿波罗的战车

此答案与Rust的1.0之前版本有关,并且删除了所需的功能您可以std::result::fold为此使用功能。遇到第一个后,它将停止迭代Err。我刚刚编写的示例程序:fn main() {&nbsp; println!("{}", go([1, 2, 3]));&nbsp; println!("{}", go([1, -2, 3]));}fn go(v: &[int]) -> Result<Vec<int>, String> {&nbsp; &nbsp; std::result::fold(&nbsp; &nbsp; &nbsp; &nbsp; v.iter().map(|&n| is_positive(n)),&nbsp; &nbsp; &nbsp; &nbsp; vec![],&nbsp; &nbsp; &nbsp; &nbsp; |mut v, e| {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v.push(e);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v&nbsp; &nbsp; &nbsp; &nbsp; })}fn is_positive(n: int) -> Result<int, String> {&nbsp; &nbsp; if n > 0 {&nbsp; &nbsp; &nbsp; &nbsp; Ok(n)&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; Err(format!("{} is not positive!", n))&nbsp; &nbsp; }}输出:Ok([1, 2, 3])Err(-2 is not positive!)

慕的地8271018

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