En Rust, las variables no son simplemente espacios de memoria que cambian a voluntad; son “enlaces” (bindings) a valores. Por defecto, todos los engranajes de Rust están diseñados para ser inmutables. Cuando declaras una variable con la palabra clave let, estás creando un enlace que no puede ser reasignado. Si intentas cambiar su valor, el compilador detendrá la compilación con un error, protegiéndote de cambios accidentales en la lógica del programa. Esta inmutabilidad por defecto es una decisión de diseño crucial que facilita la comprensión del código y evita errores comunes en la programación concurrente.

Sin embargo, existen situaciones donde necesitamos que un valor cambie. Para ello, debemos ser explícitos y utilizar let mut. El uso de mut indica claramente al lector del código (y al compilador) que esta variable tiene la intención de ser modificada. En cuanto a la estética, Rust sigue la convención snake_case (letras minúsculas separadas por guiones bajos) para nombrar variables y funciones.

El compilador de Rust también es muy estricto con la limpieza del código. Si declaras una variable y no la usas, recibirás una advertencia. Puedes evitar esto anteponiendo un guion bajo al nombre (ej. _nombre) o usando let _ = expresión para descartar un valor que no necesitas. Finalmente, Rust garantiza la “inicialización definida”: el compilador analiza todos los caminos posibles de tu código para asegurar que una variable siempre contenga un valor antes de ser leída, impidiendo el uso de memoria basura.

fn main() {
    // Declaración inmutable por defecto
    let edad = 25;
    // edad = 26; // Error de compilación: cannot assign twice to immutable variable

    // Declaración mutable mediante 'let mut'
    let mut puntuacion = 10;
    puntuacion = 15; // Es válido porque es mutable

    // Uso de la convención snake_case
    let nombre_del_usuario = "Rustacean";

    // Evitar advertencias de variables no usadas con el prefijo '_'
    let _variable_sin_uso = 42;

    // Descartar un valor explícitamente para que el compilador no lo considere un error
    let _ = 100;

    // Ejemplo de inicialización definida (definite initialization)
    let valor_final;
    let condicion = true;

    if condicion {
        valor_final = 100;
    } else {
        valor_final = 0;
    }

    println!(
        "Usuario: {}, Edad: {}, Puntos: {}, Valor: {}",
        nombre_del_usuario, edad, puntuacion, valor_final
    );
}

Explicación del Código


let edad = 25;: Declara una variable inmutable llamada edad de tipo entero. Cualquier intento de reasignación fallaría.
let mut puntuacion = 10;: La palabra clave mut permite que el valor de puntuacion cambie de 10 a 15 en la línea siguiente.
let nombre_del_usuario = "Rustacean";: Utiliza la convención snake_case para nombrar la variable de tipo cadena de texto.
let _variable_sin_uso = 42;: El prefijo _ le indica al compilador que sabemos que esta variable no se está usando, suprimiendo la advertencia (warning).
let _ = 100;: Esta sintaxis descarta el valor 100 de forma explícita, evitando avisos sobre valores no utilizados.
let valor_final;: Se declara la variable valor_final sin un valor inicial. El compilador analiza el bloque if/else para asegurar que, sin importar el camino tomado, valor_final tendrá un valor antes de llegar al println!.
println!(...): Imprime los valores de nombre_del_usuario, edad, puntuacion y valor_final en la consola.

10