In Rust is de scope van een variabele beperkt tot een blok (haakjes {}). Het declareren van een nieuwe variabele met dezelfde naam als een bestaande in de huidige of externe scope heet schaduwdimensie ("shadowing"). Shadowing stelt ons in staat om het type en de waarde van een variabele te wijzigen zonder de concept van onveranderlijkheid (immutability) te schenden.
Voorbeeld:
let x = 5; // x: i32 = 5 let x = x + 1; // x: i32 = 6 (schaduwt de oude x) let x = "hello"; // x: &str = "hello" (type is veranderd)
Shadowing heeft geen invloed op de prestaties (het is puur een syntactische constructie die wordt gecompileerd naar verschillende variabelen op het niveau van LLVM IR), maar het kan de leesbaarheid en onderhoudbaarheid van de code aanzienlijk verslechteren, waardoor het risico op logische fouten toeneemt.
Vraag: Deelt schaduwdimensie van een variabele de middelen als de vorige variabele een eigenaar had van geheugen (bijvoorbeeld, String)?
Vaak antwoord: Nee, omdat de variabele gewoon "opnieuw wordt gedefinieerd".
Juiste antwoord: Ja, wanneer een variabele wordt overschaduwd, verlaat de oude waarde de scope en, als deze het geheugen beheerde, wordt Drop aangeroepen. Dit zorgt voor een correcte vrijgave van geheugen.
Voorbeeld:
let s = String::from("abc"); let s = 5; // String wordt hier vrijgegeven (Drop wordt aangeroepen)
Verhaal
Een jonge ontwikkelaar gebruikte shadowing voor een van de structuren met een open bestandsdescriptor en, door de variabele eerder te schaduwen dan gepland, sloot hij per ongeluk het bestand voordat het werk was voltooid. Dit leidde in sommige gevallen tot dataverlies.
Verhaal
In een onderzoeksproject werd shadowing toegepast voor variabelen op hetzelfde niveau van inbedding, waardoor ontwikkelaars vaak in de war raakten en verwezen naar de " oude" waarde van de variabele, denkend dat deze nog actueel was.
Verhaal
In een groot serverapplicatie veroorzaakte impliciete shadowing van een veld van een structuur en een variabele binnen een methode een onduidelijke fout, waarbij het veld niet veranderde terwijl een nieuwe lokale variabele met dezelfde naam veranderde. De fout werd na lang zoeken naar de oorzaken van het onjuiste gedrag van het systeem ontdekt.