rust 是否可以在“while let”中使用模式匹配保护?

zsbz8rwp  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(97)

我有一个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的情况下,有没有什么方法可以使用这样的保护机制?如果没有,如果发现空字符串,有没有更好的方法可以打破循环?

pwuypxnk

pwuypxnk1#

不,while letif let模式不能有保护。已经有一些关于改变这一点的讨论(例如here),但还没有决定。
关于替代方案,我认为你的版本很清楚,我想不出任何方法来真正改善这一点。

nlejzf6q

nlejzf6q2#

对于那些从Web搜索中找到此内容的人,这里是if-let-chains RFC,它解决了if let表达式中的条件:
https://rust-lang.github.io/rfcs/2497-if-let-chains.html

相关问题