שיעורי מודול (1/2)
זמני חיים והפניות
ב-Rust, לכל הפניה יש משך חיים, התואם את ההיקף שבתוכו הפניה זו תקפה. רוב הזמן, זמני חיים מרומזים ומוסקים על ידי המהדר הודות לכללי התעלמות לכל החיים. עם זאת, כאשר הקשר בין משך החיים של הפניות שונות אינו חד משמעי, עלינו להעיר אותם במפורש.
המטרה העיקרית של תקופות חיים היא למנוע הפניות משתלשלות (הפניות לנתונים שכבר הוקצו מהזיכרון).
תחביר הערות לכל החיים
שמות לכל החיים מתחילים באפוסטרופ (') והם בדרך כלל אותיות קטנות (כמו 'a). הערות לכל החיים אינן משנות את משך החיים בפועל של משתנים, אך הן מצביעות בפני המהדר על הקשר בין תוקף התשומות והפלטים.
לדוגמה, אם פונקציה לוקחת שני פרמטרים להפניה למחרוזת ומחזירה הפניה למחרוזת, ואנו רוצים שההפניה המוחזרת תהיה חוקית כל עוד שני פרמטרי הקלט חוקיים, אנו משתמשים:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}תקופות חיים במבני נתונים
אם מבנה מכיל שדה שהוא הפניה, עלינו לציין במפורש את משך החיים של הפניה זו כדי להבטיח שמופע ה-struct לא יכול להאריך ימים יותר מהנתונים שאליהם הוא מתייחס:
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 מכיוון שהם מאוחסנים ישירות בתוך קובץ ההפעלה הבינארי.
let s: &'static str = "I have a static lifetime.";נסה זאת בעצמך
תרגיל 1: הפונקציה הארוכה ביותר
כתוב פונקציה בשם 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: מבנים עם הפניות
הגדר מבנה בשם Excerpt<'a> המכיל שדה בודד בשם חלק מהסוג &'a str. בפונקציה הראשית, צור משתנה מחרוזת בשם text והפקת קטע משתנה מסוג Excerpt על ידי השאלת הפניה לטקסט. הדפס קטע.חלק.
הצג רמז
השתמש ב-`struct Excerpt<'a> { part: &'a str }`. בהתחלה, הפעל את זה עם `Excerpt { part: &text }`.
הפתרון זמין לאחר 3 ניסיונות
תרגיל 3: הפניות סטטיות
הכרזה על משתנה בשם הודעה עם הערת סוג מפורש עבור משך החיים הסטטי (&'static str), והקצאה לו מחרוזת מילולית. הדפס את ערך ההודעה.
הצג רמז
השתמש בתחביר `תן הודעה: &'static str = 'Messaggio statico!';` כדי לציין במפורש את משך החיים הסטטי.
הפתרון זמין לאחר 3 ניסיונות