慕碼人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!)

慕的地8271018
TA貢獻1796條經驗 獲得超4個贊
- 3 回答
- 0 關注
- 665 瀏覽
添加回答
舉報
0/150
提交
取消