2016-10-26 8 views
5

मैं एक while let पाश जो Result का एक इटरेटर के ऊपर जाता है और पैटर्न मिलान का उपयोग करता है; यह इटरेटर के ऊपर जाता है जब तक यह या तो एक Err हिट या Ok के मूल्य में रिक्त स्ट्रिंग है:क्या `while let` में पैटर्न मिलान करने वाले गार्ड का उपयोग करना संभव है?

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

इस कोड को ठीक काम करता है। हालांकि, मुझे लगता है कि if कथन बदसूरत दिखता है और शायद बेवकूफ जंग नहीं है। 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

* और शायद बेवकूफ जंग नहीं है * - एफडब्ल्यूआईडब्ल्यू, मैंने इस तरह कोड लिखा है; मेरे लिए बुरा नहीं लगता है। – Shepmaster

+0

मैं उत्तरदाताओं को * प्राथमिक * प्रश्न ('चलो' जबकि गार्ड में जवाब देने पर ध्यान केंद्रित करने के लिए प्रोत्साहित करता हूं)। ओपी [शायद एक और सवाल पूछना चाहिए] (http://meta.stackexchange.com/q/39223/281829) "क्या कोई बेहतर तरीका है" पहलू के लिए। – Shepmaster

उत्तर

3

नहीं है, while let और if let पैटर्न गार्ड नहीं हो सकता। इसे बदलने के बारे में कुछ चर्चा हुई है (उदा। here), लेकिन अभी तक कुछ भी तय नहीं किया गया है।

के बारे में विकल्प, मुझे लगता है कि अपने संस्करण बहुत स्पष्ट है और मैं वास्तव में उस पर सुधार करने के लिए किसी भी तरीके के बारे में सोच नहीं कर सकते।

संबंधित मुद्दे