यह प्रश्न चिह्न ऑपरेटर किस बारे में है?


97

मैं इसके लिए प्रलेखनFile पढ़ रहा हूं :

//..
let mut file = File::create("foo.txt")?;
//..

?इस पंक्ति में क्या है ? मैं इसे रस्ट बुक में देखने से पहले याद नहीं करता।


ध्यान दें कि का वर्णन? 2018 बुक में शामिल किया गया है doc.rust-lang.org/edition-guide/rust-2018/…
Patrik Stas

जवाबों:


144

जैसा कि आपने देखा होगा, रुस्त के पास अपवाद नहीं हैं। इसमें आतंक है, लेकिन उनकी कार्यक्षमता सीमित है (वे संरचित जानकारी नहीं ले सकते हैं) और त्रुटि-हैंडलिंग के लिए उनका उपयोग हतोत्साहित किया गया है (वे अपरिवर्तनीय त्रुटियों के लिए हैं)।

जंग में, त्रुटि से निपटने का उपयोग करता है Result। एक विशिष्ट उदाहरण होगा:

fn halves_if_even(i: i32) -> Result<i32, Error> {
    if i % 2 == 0 {
        Ok(i / 2)
    } else {
        Err(/* something */)
    }
}

fn do_the_thing(i: i32) -> Result<i32, Error> {
    let i = match halves_if_even(i) {
        Ok(i) => i,
        Err(e) => return Err(e),
    };

    // use `i`
}

यह बहुत अच्छा है क्योंकि:

  • जब आप गलती से निपटने के लिए गलती से कोड नहीं लिख सकते हैं,
  • कोड को पढ़ते समय आप तुरंत देख सकते हैं कि यहाँ त्रुटि की संभावना है।

यह आदर्श से कम है, हालांकि, इसमें यह बहुत ही क्रियात्मक है। यह वह जगह है जहाँ प्रश्न चिह्न ऑपरेटर ?आता है।

ऊपर के रूप में फिर से लिखा जा सकता है:

fn do_the_thing(i: i32) -> Result<i32, Error> {
    let i = halves_if_even(i)?;

    // use `i`
}

जो बहुत अधिक संक्षिप्त है।

?यहाँ क्या है matchऊपर दिए गए कथन के बराबर है । संक्षेप में: यह Resultif को ठीक करता है और यदि नहीं तो त्रुटि देता है।

यह थोड़ा सा जादू है, लेकिन त्रुटि से निपटने के लिए बॉयलरप्लेट को काटने के लिए कुछ जादू की आवश्यकता होती है, और अपवादों के विपरीत यह तुरंत दिखाई देता है कि कौन से फ़ंक्शन कॉल में त्रुटि हो सकती है या बाहर नहीं हो सकती: जो कि सजी हैं ?

जादू का एक उदाहरण यह है कि यह भी काम करता है Option:

// Assume
// fn halves_if_even(i: i32) -> Option<i32>

fn do_the_thing(i: i32) -> Option<i32> {
    let i = halves_if_even(i)?;

    // use `i`
}

यह (अस्थिर) Tryविशेषता द्वारा संचालित है ।

यह सभी देखें:


5
यह अच्छा होगा यदि आप अपने उत्तर को थोड़ा बढ़ा सकते हैं, जैसे कि चर्चा करें कि फ़ंक्शन का वापसी प्रकार उस प्रकार से मेल खाना चाहिए जिसे आप "अनट्रैप" करने की कोशिश करते हैं, जैसे Resultया Option
नरक

@ मुझे लगता है कि बेहतर होगा कि एक नया सवाल पूरी तरह से होगा
पॉल रजवान बर्ग

2

यह पुनर्प्राप्ति योग्य त्रुटि प्रकार परिणाम <T, E> के लिए त्रुटि प्रसार के लिए है। यह परिणाम को उजागर करता है और आपको आंतरिक मूल्य देता है।

त्रुटि मामले को संभालने के बजाय, आप इसे कॉलर कोड में प्रचारित करते हैं और केवल ओके केस से निपटते हैं। लाभ है, यह बहुत सारे बॉयलरप्लेट को समाप्त करता है और फ़ंक्शन के कार्यान्वयन को सरल बनाता है।


.unwrap()एक त्रुटि के मामले में वास्तविक पैनिक से भ्रमित होने की नहीं ।
जॉर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.