web-dev-qa-db-fra.com

Quelle est la différence entre les variables immuable et const dans Rust?

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?

20
7_R3X

const, en Rust, est l'abréviation de constant et est lié à l'évaluation au moment de la compilation . Il se présente:

  • lors de la déclaration de constantes: const FOO: usize = 3;
  • lors de la déclaration de fonctions évaluables à la compilation: 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 unique

Plus 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.

18
Matthieu M.

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 -mutlet 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.

9
Chris Emerson

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.

1
user395760

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
0
aSpex