Ho appreso che se una variabile non è dichiarata esplicitamente mutabile utilizzando mut
, diventa immutabile (non può essere modificata dopo la dichiarazione). Allora perché abbiamo la parola chiave const
in Rust? Non sono loro stessi? In caso contrario, come si differenziano?Qual è la differenza tra variabili immutabili e const in Rust?
risposta
const
, a Rust, è l'abbreviazione di costante ed è relativo alla valutazione fase di compilazione. Si presenta:
- costanti quando dichiarano:
const FOO: usize = 3;
- quando si dichiara momento della compilazione funzioni valutabili:
const fn foo() -> &'static str
Questi tipi di valori possono essere utilizzati come parametri generici: [u8; FOO]
. Per ora questo è limitato alle dimensioni dell'array, ma ci sono discorsi, piani e speranze di estenderlo ulteriormente in futuro.
Al contrario, un binding let
riguarda un valore calcolato in fase di esecuzione.
Si noti che nonostante l'utilizzo di mut
perché è noto il concetto di mutabilità, Rust si trova in questo punto. &T
e &mut T
sono circa aliasing, non mutevolezza:
&T
: riferimento condiviso&mut T
: riferimento unico
In particolare, alcuni tipi presentano mutevolezza interni e possono essere mutati tramite &T
(riferimenti condivisi): Cell
, RefCell
, Mutex
, ecc.
Nota: c'è un uso alternativo dei mut
e const
con puntatori prime (*mut T
e *const T
) che non è discusso qui.
const
è una costante per la compilazione con tutto ciò che comporta. Ad esempio, è possibile creare un array di dimensioni fisse le cui dimensioni sono un const
, ma non è possibile farlo con un binding let
. Naturalmente, ciò significa anche che è possibile inserire molte più cose in un binding let
anziché in un const
.
const
non è per le variabili; è per valori costanti che non possono essere memorizzati da nessuna parte; sono effettivamente un alias per un valore letterale.
Non- mut
let
dichiara una variabile reale che viene creata in fase di esecuzione, può essere spostata (e non più accessibile), e anche avere mutevolezza interno (se contiene Cell
membri, per esempio) in alcuni casi.
costanti non possono essere ridefiniti:
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