2013-10-26 5 views
6

मैं जंग सीख रहा हूं और यह बहुत दिलचस्प लग रहा है। मैं अभी तक "मैच" से बहुत परिचित नहीं हूं, लेकिन यह काफी अभिन्न अंग दिखता है। मैं स्ट्रिंग को i64 में कनवर्ट करने के लिए निम्न कोड (नीचे) का उपयोग कर रहा था जिसमें अगली पंक्ति "_" की जगह टिप्पणी की गई पंक्ति "कोई नहीं" शामिल थी। मुझे आश्चर्य हुआ कि अंडरस्कोर के बिना गैर-मैच की स्थिति में क्या हुआ या क्या "कोई नहीं" कैच-सब हो सकता है। कॉलिंग कोड को सकारात्मक i64 की आवश्यकता होती है, इसलिए अमान्य इनपुट में नकारात्मक परिणाम (इस मामले में)। मुझे यकीन नहीं है कि एक स्ट्रक्चर का उपयोग करने के अलावा इस उदाहरण का उपयोग कर रिटर्न में त्रुटि को इंगित करना संभव है।अगर कुछ भी मेल नहीं खाता तो "मैच" का उपयोग कर जंग में क्या होता है?

  1. बिना किसी आइटम आइटम के अंडरस्कोर के, "कोई नहीं" सभी को पकड़ लेगा, और इसका उपयोग अंडरस्कोर के बजाय किया जा सकता है?

  2. क्या इस तरह के फ़ंक्शन में कोई त्रुटि वापस लौटने के लिए एक स्ट्रक्चर का उपयोग किए बिना एक त्रुटि वापस करना संभव है?

  3. सामान्यतः, "मैच" का उपयोग करके गैर-मिलान के लिए यह संभव है और यदि ऐसा है, तो क्या होता है?

  4. नीचे दिए गए उदाहरण में, अंडरस्कोर का उपयोग करने और "कोई नहीं" का उपयोग करने के बीच कोई अंतर है?

उदाहरण कोड:

fn fParseI64(sVal: &str) -> i64 { 
    match from_str::<i64>(sVal) { 
     Some(iVal) => iVal, 
//  None => -1 
    _ => -1  
    } 
} 

उत्तर

8
  1. एक मैच आइटम, "कोई नहीं" सभी को पकड़ने के रूप में अंडरस्कोर के बिना, और यह अंडरस्कोर के स्थान पर किया जा सकता है?

इस मामले में, हाँ। Option<T>: Some<T> या None के लिए केवल 2 मामले हैं। आप सभी मानों के लिए Some केस से पहले से मेल खाते हैं, None एकमात्र मामला है जो छोड़ा गया है, इसलिए None बिल्कुल _ जैसा व्यवहार करेगा।

  2. क्या वापसी के मूल्य के रूप में संरचना का उपयोग किए बिना इस तरह के किसी फ़ंक्शन में कोई त्रुटि वापस करना संभव है?

मैं आप इस विस्तृत मार्गदर्शिका पढ़ त्रुटियों को संभालने के लिए हर संभव तरीके से समझने के लिए सुझाव देंगे - http://static.rust-lang.org/doc/master/tutorial-conditions.html

विकल्प और परिणाम का उपयोग करते हुए एक struct वापस जाने के लिए की आवश्यकता होगी।

  3. सामान्यतः, "मैच" का उपयोग करके गैर-मिलान के लिए यह संभव है और यदि ऐसा है, तो क्या होता है?

जंग match संकलित नहीं करेगा अगर यह गारंटी नहीं दे सकता कि सभी संभावित मामलों को संभाला जाता है। यदि आप सभी संभावनाओं से मेल नहीं खाते हैं तो आपको _ खंड होना होगा।

  4. नीचे दिए गए उदाहरण में, अंडरस्कोर का उपयोग करने और "कोई नहीं" का उपयोग करने के बीच कोई अंतर है?

नहीं उत्तर # 1 देखें।

यहाँ कई मायनों आप अपने समारोह लिख सकते हैं के 3 प्रकार हैं:

// Returns -1 on wrong input. 
fn alt_1(s: &str) -> i64 { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     i 
    } else { 
     -1 
    }, 
    None => -1 
    } 
} 

// Returns None on invalid input. 
fn alt_2(s: &str) -> Option<i64> { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     Some(i) 
    } else { 
     None 
    }, 
    None => None 
    } 
} 

// Returns a nice message describing the problem with the input, if any. 
fn alt_3(s: &str) -> Result<i64, ~str> { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     Ok(i) 
    } else { 
     Err(~"It's less than 0!") 
    }, 
    None => Err(~"It's not even a valid integer!") 
    } 
} 

fn main() { 
    println!("{:?}", alt_1("123")); 
    println!("{:?}", alt_1("-123")); 
    println!("{:?}", alt_1("abc")); 

    println!("{:?}", alt_2("123")); 
    println!("{:?}", alt_2("-123")); 
    println!("{:?}", alt_2("abc")); 

    println!("{:?}", alt_3("123")); 
    println!("{:?}", alt_3("-123")); 
    println!("{:?}", alt_3("abc")); 
} 

आउटपुट:

123i64 
-1i64 
-1i64 
Some(123i64) 
None 
None 
Ok(123i64) 
Err(~"It's less than 0!") 
Err(~"It's not even a valid integer!") 
+0

धन्यवाद, कि बहुत व्याख्यात्मक लग रहा है। मैं दिए गए उदाहरणों का प्रयास करूंगा। –

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