In Rust ist der Geltungsbereich einer Variablen durch einen Block (geschweifte Klammern {}) begrenzt. Die Deklaration einer neuen Variablen mit demselben Namen wie eine bestehende in dem aktuellen oder äußeren Geltungsbereich wird als Schattenbildung ("shadowing") bezeichnet. Schattenbildung ermöglicht es, den Typ und den Wert einer Variablen zu ändern, ohne das Konzept der Unveränderlichkeit zu verletzen.
Beispiel:
let x = 5; // x: i32 = 5 let x = x + 1; // x: i32 = 6 (schattet das alte x) let x = "hello"; // x: &str = "hello" (Typ hat sich geändert)
Schattenbildung hat keinen Einfluss auf die Leistung (es handelt sich ausschließlich um eine syntaktische Konstruktion, die in verschiedene Variablen auf LLVM IR-Ebene kompiliert wird), kann jedoch die Lesbarkeit und Wartbarkeit des Codes erheblich beeinträchtigen und das Risiko logischer Fehler erhöhen.
Frage: Führt die Schattenbildung einer Variablen zur Freigabe von Ressourcen, wenn die vorherige Variable einen Speicherbesitzer hatte (z. B. String)?
Häufige Antwort: Nein, da die Variable einfach "überschrieben" wird.
Richtige Antwort: Ja, wenn eine Variable schattiert wird, verlässt der alte Wert den Geltungsbereich und, wenn er ein Ressource besaß, wird Drop aufgerufen. Das gewährleistet die korrekte Freigabe des Speichers.
Beispiel:
let s = String::from("abc"); let s = 5; // String wird hier freigegeben (Drop aufgerufen)
Geschichte
Ein junger Entwickler verwendete Schattenbildung bei einer Struktur mit einem offenen Dateideskriptor und schattierte versehentlich die Variable früher als geplant, wodurch die Datei vor Abschluss der Arbeit geschlossen wurde. Dies führte in einigen Fällen zum Datenverlust.
Geschichte
In einem Forschungsprojekt wurde Schattenbildung für Variablen auf derselben Verschachtelungsebene verwendet, wodurch die Entwickler oft verwirrt waren und auf den "alten" Wert der Variablen zugriffen, in dem Glauben, dass er aktuell sei.
Geschichte
In einer großen Serveranwendung führte das implizite Schattenbilden eines Strukturfeldes und einer Variable innerhalb einer Methode zu einem nicht offensichtlichen Fehler, bei dem das Feld unverändert blieb, jedoch eine neue lokale Variable mit demselben Namen geändert wurde. Der Fehler wurde nach langem Suchen nach den Ursachen des fehlerhaften Verhaltens des Systems entdeckt.