相关疑难解决方法(0)

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

我有一个函数返回一个Result:

fn find(id: &Id) -> Result<Item, ItemError> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后另一个使用它像这样:

let parent_items: Vec<Item> = parent_ids.iter()
    .map(|id| find(id).unwrap())
    .collect();
Run Code Online (Sandbox Code Playgroud)

如何在任何map迭代中处理失败的情况?

我知道我可以使用flat_map,在这种情况下,错误结果将被忽略:

let parent_items: Vec<Item> = parent_ids.iter()
    .flat_map(|id| find(id).into_iter())
    .collect();
Run Code Online (Sandbox Code Playgroud)

Result迭代器有0或1个项目,具体取决于成功状态,flat_map如果为0则会过滤掉它.

但是,我不想忽略错误,我想改为使整个代码块停止并返回一个新错误(基于映射中出现的错误,或者只是转发现有错误).

如何在Rust中最好地处理这个问题?

rust rust-result

56
推荐指数
3
解决办法
7484
查看次数

如何从结果迭代器返回包含每个错误的结果,而不仅仅是第一个错误?

我正在尝试在 Rust 中实现一个简单的解释器,为此我创建了一个Tokens结构,它采用源字符并在 a 中生成 aTokenScanErrora Result

pub struct Tokens<'src> {
    chars: Chars<'src>,
}

impl<'src> Iterator for Tokens<'src> {
    type Item = Result<Token, ScanError>;

    fn next(&mut self) -> Option<Result<Token, ScanError>> {
        //  ...
    }
}
Run Code Online (Sandbox Code Playgroud)

由于Resultimplements FromIterator,将结果收集到s的第一个ScanError或向量很简单Token

fn scan_tokens(source: &str) -> Result<Vec<Token>, ScanError> {
    let iter = Tokens {
        chars: source.chars(),
    };

    iter.collect()
}
Run Code Online (Sandbox Code Playgroud)

在出现多个错误的情况下,我真的想返回每个错误:

fn scan_tokens(source: &str) -> Result<Vec<Token>, Vec<ScanError>> {
    // what …
Run Code Online (Sandbox Code Playgroud)

error-handling iterator rust

4
推荐指数
2
解决办法
780
查看次数

标签 统计

rust ×2

error-handling ×1

iterator ×1

rust-result ×1