2016-10-26 38 views
5

我有一个while let循环遍历Result的迭代器并使用模式匹配;它越过迭代,直到它击中ErrOk的值是一个空字符串:在'while let'中可以使用模式匹配的警卫吗?

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

*可能不是惯用的Rust * - FWIW,我已经写过这样的代码;对我来说并不坏。 – Shepmaster

+0

我鼓励回答者专注于回答*主要问题(“让我们一起让步”的警卫)。 OP [也许应该问另一个问题](http://meta.stackexchange.com/q/39223/281829)为“有更好的方法”方面。 – Shepmaster

回答

3

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

关于替代品,我认为你的版本非常清晰,我想不出有什么办法可以真正改善这一点。

相关问题