objetos mutables inmutables inmutabilidad rust const immutability

inmutabilidad - ¿Cuál es la diferencia entre variables inmutables y constantes en Rust?



inmutabilidad javascript (4)

Aprendí que si una variable no se declara explícitamente como mutable usando mut , se vuelve inmutable (no se puede cambiar después de la declaración). Entonces, ¿por qué tenemos la palabra clave const en Rust? ¿No son los mismos? Si no, ¿en qué se diferencian?


Las constantes no pueden ser redefinidas:

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


const , en Rust, es corto de constante y está relacionado con la evaluación en tiempo de compilación . Se muestra:

  • al declarar constantes: const FOO: usize = 3;
  • al declarar funciones evaluables en tiempo de compilación: const fn foo() -> &''static str

Estos tipos de valores se pueden utilizar como parámetros genéricos: [u8; FOO] [u8; FOO] . Por ahora, esto se limita al tamaño de la matriz, pero hay conversaciones, planes y esperamos extenderlo más en el futuro.

Por el contrario, un enlace let es sobre un valor calculado en tiempo de ejecución.

Tenga en cuenta que a pesar de que se utiliza mut porque el concepto de mutabilidad es bien conocido, Rust realmente se encuentra aquí. &T y &mut T son sobre aliasing, no mutability:

  • &T : referencia compartida
  • &mut T : referencia única

En particular, algunos tipos presentan mutabilidad interior y se pueden mutar mediante &T (referencias compartidas): Cell , RefCell , Mutex , etc.

Nota: hay un uso alternativo de mut y const con punteros en bruto ( *mut T y *const T ) que no se trata aquí.


const es para constantes de tiempo de compilación con todo lo que conlleva. Por ejemplo, puede crear una matriz de tamaño fijo cuyo tamaño es una const , pero no puede hacerlo con un enlace let . Por supuesto, esto también significa que puede poner mucho, mucho más cosas en un enlace de let que en una const .


const no es para variables; es para valores constantes que no pueden almacenarse en ningún lugar; son efectivamente un alias para un valor literal.

Non- mut let declara una variable real que se crea en tiempo de ejecución, se puede mover (y ya no es accesible), e incluso tener mutabilidad interior (si contiene miembros de Cell , por ejemplo) en algunos casos.