मुख्य सामग्री पर जाएं
मॉड्यूल 6 · पाठ 1 का 2पाठ्यक्रम में 11/14~15 min
मॉड्यूल पाठ (1/2)

जीवनकाल और संदर्भ

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

जीवनकाल का मुख्य उद्देश्य लटकते संदर्भों को रोकना है (डेटा के संदर्भ जो पहले ही मेमोरी से हटा दिए गए हैं)।


लाइफटाइम एनोटेशन सिंटैक्स

आजीवन नाम एपॉस्ट्रॉफी (') से शुरू होते हैं और आमतौर पर छोटे लोअरकेस अक्षर होते हैं (जैसे 'a)। लाइफटाइम एनोटेशन वेरिएबल्स के वास्तविक जीवनकाल को नहीं बदलते हैं, लेकिन वे कंपाइलर को इनपुट और आउटपुट की वैधता के बीच संबंध का संकेत देते हैं।

उदाहरण के लिए, यदि कोई फ़ंक्शन दो स्ट्रिंग संदर्भ पैरामीटर लेता है और एक स्ट्रिंग संदर्भ लौटाता है, और हम चाहते हैं कि लौटाया गया संदर्भ तब तक वैध हो जब तक दोनों इनपुट पैरामीटर मान्य हैं, हम इसका उपयोग करते हैं:

Rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

डेटा संरचनाओं में जीवनकाल

यदि किसी संरचना में एक फ़ील्ड है जो एक संदर्भ है, तो हमें यह सुनिश्चित करने के लिए उस संदर्भ पर जीवनकाल को स्पष्ट रूप से एनोटेट करना होगा कि संरचना उदाहरण उस डेटा को समाप्त नहीं कर सकता है जिसे वह संदर्भित करता है:

Rust
struct ImportantExcerpt<'a> {
    part: &'a str,
}

fn main() {
    let novel = String::from("Call me Ishmael. Some years ago...");
    let first_sentence = novel.split('.').next().unwrap();
    let i = ImportantExcerpt {
        part: first_sentence,
    };
}

स्टेटिक लाइफटाइम

'static जीवनकाल एक विशेष जीवनकाल है जो कार्यक्रम की पूरी अवधि तक चलता है। सभी स्ट्रिंग अक्षर (&str) में अंतर्निहित रूप से 'static जीवनकाल होता है क्योंकि वे सीधे बाइनरी निष्पादन योग्य के अंदर संग्रहीत होते हैं।

Rust
let s: &'static str = "I have a static lifetime.";

खुद कोशिश करना

व्यायाम 1: सबसे लंबा कार्य

व्यायाम#rust.m6.l1.e1
प्रयास: 0लोड हो रहा है...

Long<'a> नाम का एक फ़ंक्शन लिखें जो दो पैरामीटर स्वीकार करता है, x प्रकार का &'a str और y प्रकार का &'a str, और प्रकार &'a str का मान लौटाता है। फ़ंक्शन के अंदर, x को वापस करने के लिए if/else ब्लॉक का उपयोग करें यदि इसकी लंबाई y से अधिक है, अन्यथा y वापस करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

`fn long<'a>(x: &'a str, y: &'a str) -> &'a str`के साथ हस्ताक्षर घोषित करें। फिर`if x.len() > y.len() { x } else { y }` का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है

अभ्यास 2: सन्दर्भों के साथ संरचनाएँ

व्यायाम#rust.m6.l1.e2
प्रयास: 0लोड हो रहा है...

Excerpt<'a> नामक एक संरचना को परिभाषित करें जिसमें &'a str प्रकार के भाग नामक एकल फ़ील्ड शामिल है। मुख्य फ़ंक्शन में, टेक्स्ट नामक एक स्ट्रिंग वेरिएबल बनाएं और टेक्स्ट के संदर्भ को उधार लेकर अंश प्रकार के एक वेरिएबल अंश को तुरंत चालू करें। अंश.भाग मुद्रित करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

`struct Excerpt<'a> {part: &'a str }`का प्रयोग करें। मुख्य रूप से इसे`अंश {भाग: और पाठ }` के साथ त्वरित करें।

3 प्रयासों के बाद समाधान उपलब्ध है

अभ्यास 3: स्थैतिक संदर्भ

व्यायाम#rust.m6.l1.e3
प्रयास: 0लोड हो रहा है...

स्थिर जीवनकाल (&'static str) के लिए एक स्पष्ट प्रकार के एनोटेशन के साथ एक वैरिएबल नामित संदेश घोषित करें, इसे एक स्ट्रिंग अक्षरशः निर्दिष्ट करें। संदेश का मान प्रिंट करें.

संपादक लोड हो रहा है...
संकेत दिखाएँ

स्थिर जीवनकाल को स्पष्ट रूप से एनोटेट करने के लिए सिंटैक्स `let message: &'static str = 'Messaggio statico!';` का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है