J'ai appris que si une variable n'est pas explicitement déclarée mutable à l'aide de mut
, elle devient immuable (elle ne peut pas être modifiée après la déclaration). Alors pourquoi avons-nous le mot clé const
dans Rust? Ne sont-ils pas pareils? Si non, en quoi diffèrent-ils?
const
, en Rust, est l'abréviation de constant et est lié à l'évaluation au moment de la compilation . Il se présente:
const FOO: usize = 3;
const fn foo() -> &'static str
Ces types de valeurs peuvent être utilisés en tant que paramètres génériques: [u8; FOO]
. Pour l'instant, la taille du tableau est limitée, mais il y a des discussions, des projets et nous espérons l'étendre davantage à l'avenir.
En revanche, une liaison let
concerne une valeur calculée au moment de l’exécution.
Notez que malgré l'utilisation de mut
car le concept de mutabilité est bien connu, Rust se trouve en fait ici. &T
et &mut T
concernent l'aliasing, pas la mutabilité:
&T
: référence partagée&mut T
: référence uniquePlus particulièrement, certains types présentent une mutabilité intérieure et peuvent être mutés via &T
(références partagées): Cell
, RefCell
, Mutex
, etc.
Remarque: il existe une autre utilisation de mut
et const
avec des pointeurs bruts (*mut T
et *const T
) qui n’est pas traitée ici.
const
n'est pas pour les variables; c'est pour des valeurs constantes qui ne peuvent être stockées nulle part; ils sont en réalité un alias pour une valeur littérale.
Non -mut
let
déclare une variable réelle créée à l'exécution, pouvant être déplacée (et désormais inaccessible), et pouvant même présenter une mutabilité intérieure (si elle contient des membres Cell
, par exemple) dans certains cas.
const
est pour les constantes à la compilation avec tout ce que cela implique. Par exemple, vous pouvez créer un tableau de taille fixe dont la taille est une const
, mais vous ne pouvez pas le faire avec une liaison let
. Bien sûr, cela signifie également que vous pouvez placer beaucoup plus d'éléments dans une liaison let
que dans une const
.
Les constantes ne peuvent pas être redéfinies:
let x = 10u32;
const Y:u32 = 20u32;
let x = 11u32;
//error: duplicate definition of value `Y` [E0428]
//const Y:u32 = 21u32;
println!("x={} Y={}",x,Y); //x=11 Y=20