2016-10-26 44 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),但還沒有任何決定。

關於替代品,我認爲你的版本非常清晰,我想不出有什麼辦法可以真正改善這一點。

相關問題