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 delet mut totalîn afara buclei.
Comenzi înrudite
variabile și mutabilitate (let, mut): let creează o variabilă. Implicit nu poate fi modificată; cu let mut primește voie să-și schimbe valoarea.tipuri scalare (întregi, f64, bool, char): Tipurile de bază ale lui Rust: întregi cu și fără semn, numere cu virgulă, bool (true/false) și char (un caracter Unicode).as (conversii numerice): Convertește explicit o valoare numerică (sau char, bool) în alt tip primitiv. Conversia nu dă niciodată eroare, dar poate pierde informație.