דילוג לתוכן המרכזי
מודול 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
    }
}

תקופות חיים במבני נתונים

אם מבנה מכיל שדה שהוא הפניה, עלינו לציין במפורש את משך החיים של הפניה זו כדי להבטיח שמופע ה-struct לא יכול להאריך ימים יותר מהנתונים שאליהם הוא מתייחס:

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. בתוך הפונקציה, השתמש בבלוק if/else כדי להחזיר את x אם אורכו גדול מ-y, אחרת החזר את y.

טוען עורך...
הצג רמז

הכריז על החתימה עם `fn longest<'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. בפונקציה הראשית, צור משתנה מחרוזת בשם text והפקת קטע משתנה מסוג Excerpt על ידי השאלת הפניה לטקסט. הדפס קטע.חלק.

טוען עורך...
הצג רמז

השתמש ב-`struct Excerpt<'a> { part: &'a str }`. בהתחלה, הפעל את זה עם `Excerpt { part: &text }`.

הפתרון זמין לאחר 3 ניסיונות

תרגיל 3: הפניות סטטיות

פעילות גופנית#rust.m6.l1.e3
ניסיונות: 0טוען...

הכרזה על משתנה בשם הודעה עם הערת סוג מפורש עבור משך החיים הסטטי (&'static str), והקצאה לו מחרוזת מילולית. הדפס את ערך ההודעה.

טוען עורך...
הצג רמז

השתמש בתחביר `תן הודעה: &'static str = 'Messaggio statico!';` כדי לציין במפורש את משך החיים הסטטי.

הפתרון זמין לאחר 3 ניסיונות