مرکزی مواد پر جائیں
ماڈیول 6 · سبق 1 از 2کورس میں 11/14~15 min
ماڈیول اسباق (1/2)

زندگی اور حوالہ جات

زنگ میں، ہر حوالہ کی ایک زندگی ہوتی ہے، جو اس دائرہ کار سے مطابقت رکھتی ہے جس کے اندر وہ حوالہ درست ہے۔ زیادہ تر وقت، لائف ٹائمز مضمر ہوتے ہیں اور لائف ٹائم ایلیشن رولز کی بدولت مرتب کرنے والے کے ذریعہ اندازہ لگایا جاتا ہے۔ تاہم، جب مختلف حوالوں کی زندگیوں کے درمیان تعلق مبہم ہو، تو ہمیں انہیں واضح طور پر بیان کرنا چاہیے۔

زندگی بھر کا بنیادی مقصد لٹکتے ہوئے حوالہ جات کو روکنا ہے (ڈیٹا کے حوالہ جات جو پہلے ہی میموری سے ڈیلوکٹ ہو چکے ہیں)۔


لائف ٹائم تشریح کا نحو

تاحیات نام ایک apostrophe (') سے شروع ہوتے ہیں اور عام طور پر چھوٹے چھوٹے حروف ہوتے ہیں (جیسے '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لوڈ ہو رہا ہے…

longest<'a> کے نام سے ایک فنکشن لکھیں جو دو پیرامیٹرز کو قبول کرتا ہے، قسم کا x &'a str اور y قسم &'a str، اور قسم &'a str کی قدر لوٹاتا ہے۔ فنکشن کے اندر، اگر اس کی لمبائی y سے زیادہ ہے تو x واپس کرنے کے لیے if/else بلاک کا استعمال کریں، ورنہ y لوٹائیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

دستخط کا اعلان `fn سب سے لمبا<'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 ہے۔ مین فنکشن میں، ٹیکسٹ کے نام سے ایک سٹرنگ ویری ایبل بنائیں اور ٹیکسٹ کا حوالہ ادھار لے کر Excerpt قسم کے متغیر اقتباس کو فوری بنائیں۔ اقتباس پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

`struct کا اقتباس <'a> { حصہ: &'a str }`استعمال کریں۔ بنیادی طور پر اسے`Excerpt { part: &text }` کے ساتھ فوری بنائیں۔

3 کوششوں کے بعد حل دستیاب ہے۔

مشق 3: جامد حوالہ جات

ورزش#rust.m6.l1.e3
کوششیں: 0لوڈ ہو رہا ہے…

جامد زندگی بھر (&'static str) کے لیے واضح قسم کی تشریح کے ساتھ متغیر نامی پیغام کا اعلان کریں، اسے سٹرنگ لٹریل تفویض کریں۔ پیغام کی قیمت پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

جامد لائف ٹائم کو واضح طور پر تشریح کرنے کے لیے نحو کا استعمال کریں `let message: &'static str = 'Messaggio statico!';`۔

3 کوششوں کے بعد حل دستیاب ہے۔