2016-10-26 4 views
5

私はwhile letのループを持っていて、それはResultのイテレータを通り、パターンマッチングを使います。`while let`でパターンマッチガードを使用することはできますか?

while let Some(Ok(a)) = some_iterator.next() { 
    if a == "" { 
     break; 
    } 
    // ... 
} 

このコードは正常に動作します:それはヒットするまで、それは、ErrまたはOkの値が空の文字列であるイテレータの上に行きます。しかし、私はifのステートメントは醜いと思うし、おそらく慣用錆はありません。パターンマッチングは、構文エラーを引き起こし、それをサポートするために存在していないよう採用が

match foo { 
    Some(Ok(a)) if a != "" => bar(a) 
    // ... 
} 

これは、私のwhile letループのための理想的な次のようになりますので、同じようmatch文では、警備員は、パターンマッチングに使用することができます。

while let Some(Ok(a)) = some_iterator.next() if a != "" { // <-- Syntax error 
    // ... 
} 

while letの条件で、このようなガードを使用する方法はありますか。そうでない場合は、空の文字列が見つかった場合、ループから抜け出すためのよりよい方法がありますか?

+1

*おそらく慣用錆ではありません* - FWIW、私はそのようなコードを書いています。私には悪く見えません。 – Shepmaster

+0

私は、回答者が*プライマリ*の質問に答えることに集中することを奨励したいと思います( 'while let'の警備員)。 OPは[もっと良い方法はありますか?]という点については、おそらく別の質問をするべきです(http://meta.stackexchange.com/q/39223/281829)。 – Shepmaster

答えて

3

いいえ、while letおよびif letのパターンにガードを設定することはできません。それを変更することについていくつかの議論がありましたが(例:here)、まだ決定されていません。

代替案については、あなたのバージョンはかなり明確だと思います。本当に改善する方法はありません。

関連する問題