Salt la conținutul principal
Modulul 6 · Lecția 1 din 211/14 în curs~15 min
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:

Rust
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ă:

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,
    };
}

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.

Rust
let s: &'static str = "I have a static lifetime.";

Încercați-l singur

Exercițiul 1: Cea mai lungă funcție

Exercițiu#rust.m6.l1.e1
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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

Exercițiu#rust.m6.l1.e2
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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

Exercițiu#rust.m6.l1.e3
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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