"लूप" को समाप्त करने पर "ब्रेक" को अर्धविराम की आवश्यकता क्यों नहीं है?

Nov 26 2020

रस्ट बुक के अध्याय 3.5 से अंश :

... हम breakमूल्य के साथ कीवर्ड का उपयोग करते हैं counter * 2। लूप के बाद, हम उस स्टेटमेंट को समाप्त करने के लिए एक अर्धविराम का उपयोग करते हैं जो मान प्रदान करता है result

प्लस कोड स्निपेट:

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}

मैं समझता हूं कि यह कैसे काम करता है और परिणाम 20 क्यों है, लेकिन मैंने देखा कि अगर मैं "ब्रेक" कीवर्ड वाली लाइन पर अर्धविराम को हटाता हूं, तो कार्यक्रम समकक्ष है।

इस मामले में अर्धविराम वैकल्पिक क्यों है?

जवाब

5 E_net4thecurator Nov 26 2020 at 22:30

एक छोटा उदाहरण:

let _: i32 = loop {
    if true {
        break 3; // ()
    }
};

यह सिर्फ एक और उदाहरण है जहां अर्ध-उपनिवेश का इरादा परिणाम में हस्तक्षेप नहीं करता है। एक के लिए, एक अर्ध-बृहदान्त्र का सम्मिलन एक अभिव्यक्ति कथन प्रस्तुत करता है, जो इकाई प्रकार का मूल्यांकन करता है ()। जैसा कि loops और ifअभिव्यक्तियाँ एक ही प्रकार का मूल्यांकन करने वाले कोड ब्लॉक को स्वीकार करना जारी रखती हैं (), तब सभी प्रकार अनुरूप होते हैं।

let _: i32 = loop {
    if true {
        break 3 // !
    }
};

यदि अर्ध-बृहदान्त्र को हटा दिया जाता है, तो कभी भी उस प्रकारbreak का मूल्यांकन नहीं! किया जाता है , जो किसी अन्य प्रकार के लिए होता है। इसका मतलब है कि यह बाहरी दायरे द्वारा अपेक्षित किसी भी प्रकार को पूरा करेगा। तो सब ठीक ही है, इसलिए जब तक आप किसी अन्य स्टेटमेंट को इफ़ेक्ट के अंत से पहले जोड़ने की कोशिश न करें।

दोनों breakऔर उनके साइड इफेक्ट्स के रूप में returnमूल्यांकन करते !हैं कि प्रोग्राम प्राकृतिक वर्कफ़्लो के माध्यम से नहीं जाएगा।

यह सभी देखें:

  • अनावश्यक होने पर रिटर्न एक्ट्रेसेस सेमीकोलन का उपयोग क्यों करते हैं?
  • रिटर्न स्टेटमेंट का उपयोग करने और रस्ट में अर्धविराम को छोड़ने के बीच क्या अंतर है?
  • किसी फ़ंक्शन के अंत को सांख्यिकीय रूप से कैसे निर्दिष्ट किया जाए, यह उपलब्ध नहीं है
3 pretzelhammer Nov 26 2020 at 22:42

अभिव्यक्ति विवरण पर जंग भाषा का संदर्भ :

एक अभिव्यक्ति कथन वह है जो किसी अभिव्यक्ति का मूल्यांकन करता है और उसके परिणाम की उपेक्षा करता है। एक नियम के रूप में, एक अभिव्यक्ति कथन का उद्देश्य अपनी अभिव्यक्ति के मूल्यांकन के प्रभावों को ट्रिगर करना है।

एक अभिव्यक्ति जिसमें केवल एक ब्लॉक एक्सप्रेशन या नियंत्रण प्रवाह अभिव्यक्ति होती है, यदि एक संदर्भ में उपयोग किया जाता है जहां एक कथन की अनुमति होती है, तो अनुगामी अर्धविराम को छोड़ दिया जा सकता है

मुझे लगता है कि यह विशुद्ध रूप से सौंदर्यशास्त्र और एर्गोनॉमिक्स के लिए है, क्योंकि लगभग सब कुछ रस्ट में एक अभिव्यक्ति है। यदि अनुगामी अर्धविराम सभी अभिव्यक्तियों के बाद अनिवार्य था तो हमें अर्धविराम के साथ अगर-और ब्लॉक (जो भी अभिव्यक्ति हैं) को समाप्त करना होगा, जो भयानक लगता है:

if {
    // do something
} else {
    // do something else
}; // <- gross

इसी तरह, हम सभी नियंत्रण प्रवाह अभिव्यक्तियों पर अनुगामी अर्धविराम को छोड़ सकते हैं क्योंकि वे नियंत्रण प्रवाह का उत्पादन करते हैं, इसलिए अर्धविराम का विशिष्ट कार्य, जो अभिव्यक्ति के परिणाम को त्यागने और ()इसके बजाय मूल्यांकन करने के लिए अप्रासंगिक हो जाता है।

fn five() -> i32 {
    return 5 // to semicolon or not to semicolon? it doesn't matter
}

उपरोक्त उदाहरण में, इससे कोई फर्क नहीं पड़ता है अगर हम return 5अर्धविराम के साथ समाप्त होते हैं या नहीं क्योंकि कुछ भी उस अभिव्यक्ति के परिणाम को "कैप्चर" नहीं कर सकता है क्योंकि यह नियंत्रण प्रवाह का उत्पादन करता है। उसी तरह अन्य नियंत्रण प्रवाह भाव के लिए सच हो जाएगा breakऔर continue