是否可以在`while let`中使用模式匹配防护?

Aar*_*sen 6 pattern-matching while-loop rust

我有一个while let循环遍历迭代器Result并使用模式匹配; 它遍历迭代器,直到它命中一个Err或者它Ok的值是一个空字符串:

while let Some(Ok(a)) = some_iterator.next() {
    if a == "" {
        break;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.但是,我认为这个if陈述看起来很难看,可能不是惯用的Rust.在match语句中,保护可以用于模式匹配,如下所示:

match foo {
    Some(Ok(a)) if a != "" => bar(a)
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这对我的while let循环来说是理想的,虽然那里使用的模式匹配似乎不支持它,导致语法错误:

while let Some(Ok(a)) = some_iterator.next() if a != "" { // <-- Syntax error
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这样的情况下,有没有办法使用这样的守卫while let?如果没有,如果发现空字符串,是否有更好的方法可以打破循环?

fjh*_*fjh 7

没有,while let并且if let图案不能有警卫。有一些关于改变它的讨论(例如这里),但还没有决定。

关于替代方案,我认为您的版本非常清楚,我想不出任何可以真正改进的方法。