2016-06-17 12 views
11

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

11

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.

1

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.

8

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

0

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 
Problemi correlati