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

时间:2016-10-26 18:04:38

标签: while-loop pattern-matching rust

我有一个while let循环遍历Result的迭代器并使用模式匹配;它遍历迭代器,直到它遇到ErrOk的值为空字符串:

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的条件下,有没有办法使用这样的守卫?如果没有,如果找到空字符串,是否有更好的方法可以打破循环?

1 个答案:

答案 0 :(得分:3)

不,while letif let模式不能有警卫。已经有一些关于改变它的讨论(例如here),但还没有任何决定。

关于替代方案,我认为你的版本很清楚,我想不出任何真正改进的方法。