الانتقال إلى المحتوى الرئيسي
الوحدة 6 · الدرس 1 من 211/14 في الدورة~15 min
دروس الوحدة (1/2)

الحياة والمراجع

في Rust، كل مرجع له مدة حياة، والتي تتوافق مع النطاق الذي يكون هذا المرجع صالحًا ضمنه. في معظم الأحيان، تكون فترات الحياة ضمنية ويستنتجها المترجم بفضل قواعد الحذف مدى الحياة. ومع ذلك، عندما تكون العلاقة بين أعمار المراجع المختلفة غامضة، يجب علينا شرحها بشكل واضح.

الهدف الرئيسي من فترات الحياة هو منع المراجع المتدلية (مراجع البيانات التي تم إلغاء تخصيصها بالفعل من الذاكرة).


بناء جملة التعليق التوضيحي مدى الحياة

تبدأ الأسماء الدائمة بفاصلة عليا (') وتكون عادةً بأحرف صغيرة قصيرة (مثل '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جارٍ التحميل…

اكتب دالة باسم الأطول<'a> تقبل معلمتين، x من النوع &'a str وy من النوع &'a str، وترجع قيمة من النوع &'a str. داخل الدالة، استخدم كتلة if/else لإرجاع x إذا كان طولها أكبر من y، وإلا قم بإرجاع 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 عن طريق استعارة مرجع إلى النص. طباعة مقتطفات.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `مقتطف البنية<'a> { الجزء: &'a str }`. بشكل رئيسي، قم بإنشاء مثيل له باستخدام `Excerpt { Part: &text }`.

الحل متاح بعد 3 من المحاولات

التمرين 3: المراجع الثابتة

تمرين#rust.m6.l1.e3
المحاولات: 0جارٍ التحميل…

قم بتعريف متغير مسمى رسالة مع تعليق توضيحي من النوع الصريح للعمر الثابت (&'static str)، وتخصيص سلسلة حرفية له. طباعة قيمة الرسالة.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم الصيغة `let message: &'static str = 'Messaggio statico!';` للتعليق بشكل صريح على العمر الثابت.

الحل متاح بعد 3 من المحاولات