2017-02-20 11 views
9

मैं जाँच करने के लिए एक स्ट्रिंग '$' है या नहीं करना चाहते हैं और अगर वहाँ '$' के बाद कुछ है:क्या एक ही मैच हाथ में एक मैच गार्ड के साथ दो पैटर्न गठबंधन करना संभव है?

fn test(s: String) { 
    match s.find('$') { 
     None | (Some(pos) if pos == s.len() - 1) => { 
      expr1(); 
     } 
     _ => { expr2(); } 
    } 
} 

लेकिन यह संकलन नहीं करता है::

मैं इस कोड की कोशिश की

error: expected one of `)` or `,`, found `if` 

यह एक मैच हाथ में None और Some गठबंधन करने के लिए असंभव है?

यदि हां, तो क्या यह एक अलग तरीका है जिसे इसे expr1() डुप्लिकेट करने के लिए एक अलग फ़ंक्शन में छोड़कर छोड़ने का कोई आसान तरीका नहीं है?

उत्तर

7

यह असंभव मैच गार्ड (if thingy) के लिए (बातें | प्रतीकों से विभाजित) केवल एक ही पैटर्न विकल्प के लिए लागू है। प्रति हाथ केवल एक मैच-गार्ड है और यह उस हाथ के सभी पैटर्न पर लागू होता है।

हालांकि, आपकी विशिष्ट समस्या के लिए कई समाधान हैं। उदाहरण के लिए:

if s.find('$').map(|i| i != s.len() - 1).unwrap_or(false) { 
    expr2(); 
} else { 
    expr1(); 
} 
+3

यह काम करता है, लेकिन इस तथ्य पर निर्भर करता है कि '$' ASCII है और इस प्रकार एक बाइट लेता है। एक और सामान्य समाधान ['char :: len_utf8'] (https://doc.rust-lang.org/std/primitive.char.html#method.len_utf8) का उपयोग कर सकता है:' i! = S.len() - 'c'.len_utf8() '। – Shepmaster

+2

मैं कोड गोल्फ में चाहता हूं: 's.chars()। Skip_while (| i | i! = '$')। छोड़ें (1) .next()। Is_some()' किसी भी इंडेक्स कंप्यूटेशंस इमो से कहीं अधिक स्पष्ट है –

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