亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當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 關注
  • 665 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號