【问题标题】:Is it possible to use pattern matching guards in a `while let`?是否可以在“while let”中使用模式匹配保护?
【发布时间】:2017-03-09 05:32:22
【问题描述】:

我有一个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 的情况下使用这样的守卫?如果没有,如果找到一个空字符串,有没有更好的方法来跳出循环?

【问题讨论】:

  • 而且可能不是惯用的 Rust — FWIW,我写过这样的代码;对我来说似乎并不坏。
  • 我鼓励回答者专注于回答主要问题(while let 中的警卫)。 OP should probably ask another question 用于“有没有更好的方法”方面。

标签: while-loop pattern-matching rust


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多