我有一个while let
循环遍历Result
的迭代器并使用模式匹配;它遍历迭代器,直到它遇到Err
或Ok
的值为空字符串:
while let Some(Ok(a)) = some_iterator.next() {
if a == "" {
break;
}
// ...
}
此代码工作正常。但是,我认为if
语句看起来很难看,可能不是惯用的Rust。在match
语句中,保护可以用于模式匹配,如下所示:
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
的条件下,有没有办法使用这样的守卫?如果没有,如果找到空字符串,是否有更好的方法可以打破循环?
答案 0 :(得分:3)
不,while let
和if let
模式不能有警卫。已经有一些关于改变它的讨论(例如here),但还没有任何决定。
关于替代方案,我认为你的版本很清楚,我想不出任何真正改进的方法。