我有一个while let
循环,它遍历Result
的迭代器并使用模式匹配;它遍历迭代器,直到它遇到Err
或者Ok
的值是一个空字符串:
while let Some(Ok(a)) = some_iterator.next() {
if a == "" {
break;
}
// ...
}
这段代码运行良好。但是,我认为if
语句看起来很丑,可能不是惯用的Rust。在match
语句中,可以在模式匹配中使用guards,如下所示:
match foo {
Some(Ok(a)) if a != "" => bar(a)
// ...
}
这对于我的while let
循环来说是理想的,尽管那里使用的模式匹配似乎不支持它,导致语法错误:
while let Some(Ok(a)) = some_iterator.next() if a != "" { // <-- Syntax error
// ...
}
在while let
的情况下,有没有什么方法可以使用这样的保护机制?如果没有,如果发现空字符串,有没有更好的方法可以打破循环?
2条答案
按热度按时间pwuypxnk1#
不,
while let
和if let
模式不能有保护。已经有一些关于改变这一点的讨论(例如here),但还没有决定。关于替代方案,我认为你的版本很清楚,我想不出任何方法来真正改善这一点。
nlejzf6q2#
对于那些从Web搜索中找到此内容的人,这里是
if-let-chains
RFC,它解决了if let
表达式中的条件:https://rust-lang.github.io/rfcs/2497-if-let-chains.html