shadowing (umbrirea variabilelor) în Rust

Declari din nou o variabilă cu același nume: cea nouă o ascunde pe cea veche și poate avea chiar alt tip.

Sintaxă
let x = 5;
let x = x * 2;          // un x nou îl ascunde pe cel vechi
let text = "42";
let text: i32 = text.parse().unwrap();   // poate avea alt tip

Ce face shadowing (umbrirea variabilelor)

Shadowing (umbrire) înseamnă să scrii din nou let cu un nume deja folosit. Se creează o variabilă nouă, iar de la acel punct numele se referă la ea. Variabila veche există în continuare, dar nu mai poate fi atinsă prin nume.

Diferența față de let mut: variabila nouă poate avea alt tip (de exemplu un &str citit de la tastatură devine u32 cu același nume), iar după transformări rezultatul rămâne imuabil.

Umbrirea ține doar până la sfârșitul blocului în care a fost făcută. După }, numele se referă din nou la variabila din exterior.

Exemple

Exemplul 1: Același nume, alt tip

Textul citit este curățat de spații, apoi transformat în număr. Toate cele trei variabile se numesc varsta, deci nu ai nevoie de nume ca varsta_text și varsta_numar.

fn main() {
    let varsta = "  17 \n";
    let varsta = varsta.trim();
    let varsta: u32 = varsta.parse().unwrap();
    println!("Peste un an vei avea {} ani", varsta + 1);
}

Rezultat

Peste un an vei avea 18 ani

Exemplul 2: Umbrirea ține până la sfârșitul blocului

În blocul interior, pret este prețul cu reducere. După }, numele se referă din nou la prețul inițial, care nu a fost modificat.

fn main() {
    let pret = 200;
    {
        let pret = pret * 80 / 100;
        println!("Preț cu reducere: {pret} lei");
    }
    println!("Preț normal: {pret} lei");
}

Rezultat

Preț cu reducere: 160 lei
Preț normal: 200 lei

Greșeli frecvente

  • Crezi că shadowing-ul modifică variabila veche. Nu o modifică: într-un bloc interior, după } vezi din nou valoarea veche (exemplul 2).
  • Folosești shadowing într-o buclă ca să aduni ceva: let total = total + x; în corpul buclei creează la fiecare pas o variabilă nouă care dispare la sfârșitul pasului. Pentru acumulare ai nevoie de let mut total în afara buclei.

Comenzi înrudite