我有一个函数返回一个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 关注
- 613 浏览
添加回答
举报
0/150
提交
取消