Lecții din modul (1/2)
Durate de viață și referințe
În Rust, fiecare referință are o durată de viață, care corespunde domeniului în care referința este valabilă. De cele mai multe ori, duratele de viață sunt implicite și deduse de compilator datorită regulilor de elision pe viață. Cu toate acestea, atunci când relația dintre duratele de viață ale diferitelor referințe este ambiguă, trebuie să le adnotăm în mod explicit.
Obiectivul principal al duratelor de viață este de a preveni referințele suspendate (referințe la date care au fost deja dealocate din memorie).
Sintaxa de adnotare pe viață
Numele de viață încep cu un apostrof (') și sunt de obicei litere mici mici (cum ar fi 'a). Adnotările de viață nu modifică durata de viață reală a variabilelor, dar indică compilatorului relația dintre validitatea intrărilor și ieșirilor.
De exemplu, dacă o funcție ia doi parametri de referință și returnează o referință și dorim ca referința returnată să fie validă atâta timp cât ambii parametrii de intrare sunt validi, folosim:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}Durate de viață în structurile de date
Dacă o structură conține un câmp care este o referință, trebuie să adnotăm în mod explicit durata de viață a acelei referințe pentru a ne asigura că instanța structurii nu poate supraviețui datelor la care se referă:
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,
};
}Durata de viață statică
Durata de viață 'static este o durată de viață specială care durează pe întreaga durată a programului. Toate literalele șir (&str) au implicit o durată de viață 'static deoarece sunt stocate direct în executabilul binar.
let s: &'static str = "I have a static lifetime.";Încercați-l singur
Exercițiul 1: Cea mai lungă funcție
Scrieți o funcție numită longest<'a> care acceptă doi parametri, x de tip &'a str și y de tip &'a str și returnează o valoare de tip &'a str. În interiorul funcției, utilizați un bloc if/else pentru a returna x dacă lungimea sa este mai mare decât y, în caz contrar returnați y.
Afișează indiciu
Declarați semnătura cu `fn longest<'a>(x: &'a str, y: &'a str) -> &'a str`. Apoi folosiți `if x.len() > y.len() { x } else { y }`.
Soluție disponibilă după 3 încercări
Exercițiul 2: Structuri cu referințe
Definiți o structură numită Excerpt<'a> care conține un singur câmp numit parte din tipul &'a str. În funcția principală, creați o variabilă șir numită text și instanțiați un fragment de variabilă de tip Excerpt împrumutând o referință la text. Imprimare extras.part.
Afișează indiciu
Utilizați `struct Excerpt<'a> { part: &'a str }`. În principal, instanțiați-l cu `Excerpt { part: &text }`.
Soluție disponibilă după 3 încercări
Exercițiul 3: Referințe statice
Declarați o variabilă numită mesaj cu o adnotare de tip explicită pentru durata de viață statică (&'static str), atribuindu-i un șir literal. Tipăriți valoarea mesajului.
Afișează indiciu
Utilizați sintaxa `let message: &'static str = 'Messaggio static!';` pentru a adnota în mod explicit durata de viață statică.
Soluție disponibilă după 3 încercări