Le shadowing est la possibilité de déclarer plusieurs fois une variable avec le même nom dans une même portée, la nouvelle variable "masquant" la précédente. Dans les langages sans shadowing (C, C++), la redéfinition d'une variable entraîne une erreur ou un comportement indéfini. Rust permet le shadowing, et chaque variable est un objet indépendant avec un nouveau type ou une nouvelle valeur. Cela est pratique pour effectuer des transformations progressives d'une valeur — par exemple, convertir directement une chaîne en un nombre, sans avoir à inventer de nouveaux noms.
Problème : d'une part, l'amélioration de la lisibilité, la prévention de l'enflure des noms de variables ; de l'autre, un débogage difficile si l'on masque accidentellement une variable dans un bloc complexe et obtient un résultat inattendu.
Solution : Le shadowing n'est utilisé que là où cela facilite vraiment la transformation et ne détériore pas la lisibilité. Chaque "let var = ...;" crée une nouvelle variable, l'ancienne reste inchangée en dehors du bloc de déclaration.
Exemple de code :
fn example() { let x = "42"; let x = x.parse::<i32>().unwrap(); println!("x: {}", x); // x: 42 }
Caractéristiques clés :
Le shadowing peut-il modifier la mutabilité d'une variable ?
Oui, on peut "masquer" une variable immuable par une mutable et vice versa :
let x = 5; let mut x = x; x += 1;
Le shadowing signifie-t-il que la variable précédente a été détruite ?
Non, les valeurs de la variable précédente vivent jusqu'à la fin du bloc où elles ont été déclarées, mais elles deviennent inaccessibles par leur nom.
Peut-on utiliser le shadowing à l'intérieur d'une boucle ou dans des blocs imbriqués ?
Oui, chaque portée permet de déclarer des variables avec les mêmes noms, et ce sont des variables différentes.
Dans une fonction, il y a let result = expr1; ... let result = expr2;, où les types diffèrent.
Avantages :
Inconvénients :
Le shadowing est utilisé uniquement pour changer le type : d'abord, on analyse une chaîne, puis on assigne un nombre.
Avantages :
Inconvénients :