Shadowing ist die Möglichkeit, eine Variable mit demselben Namen mehrfach im selben Gültigkeitsbereich zu deklarieren, wobei die neue Variable die vorherige "überschattet". In Sprachen ohne Shadowing (C, C++) führt die erneute Definition einer Variable zu einem Fehler oder undefiniertem Verhalten. Rust erlaubt Shadowing, und jede Variable ist ein unabhängiger Objekt mit neuem Typ oder Wert. Dies ist praktisch für schrittweise Wertetransformationen – zum Beispiel, um einen String direkt in eine Zahl umzuwandeln, ohne neue Namen zu erfinden.
Problem: auf der einen Seite – Verbesserung der Lesbarkeit, Vermeidung von übermäßigen Variablennamen; auf der anderen Seite – erschwerter Debugging, wenn versehentlich eine Variable in einem komplexen Block "überschattet" wird und unerwartete Ergebnisse entstehen.
Lösung: Shadowing wird nur dort verwendet, wo es tatsächlich die Transformation erleichtert und die Lesbarkeit nicht verschlechtert. Jede "let var = ...;" erstellt eine neue Variable, die alte bleibt außerhalb des Deklarationsblocks unverändert.
Beispielcode:
fn example() { let x = "42"; let x = x.parse::<i32>().unwrap(); println!("x: {}", x); // x: 42 }
Wichtige Merkmale:
Kann Shadowing die Mutabilität einer Variablen ändern?
Ja, man kann eine unveränderliche Variable durch eine veränderliche überschattiere und umgekehrt:
let x = 5; let mut x = x; x += 1;
Bedeutet Shadowing, dass die vorherige Variable zerstört wurde?
Nein, die Werte der vorherigen Variable leben bis zum Ende des Blocks, in dem sie deklariert wurden, sind aber nicht mehr über ihren Namen zugänglich.
Kann man Shadowing innerhalb einer Schleife oder in verschachtelten Blöcken verwenden?
Ja, jeder Gültigkeitsbereich (Scope) erlaubt es, Variablen mit denselben Namen zu deklarieren, und das sind unterschiedliche Variablen.
In einer Funktion gibt es let result = expr1; ... let result = expr2;, wo die Typen unterschiedlich sind.
Vorteile:
Nachteile:
Shadowing wird nur verwendet, um den Typ zu ändern: zuerst wird ein String geparst, dann eine numerische Zuweisung.
Vorteile:
Nachteile: