ProgramaciónDesarrollador Backend

Explique qué son las constantes y las variables estáticas en Rust, cuáles son sus diferencias y en qué casos es preferible usar cada una de ellas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Rust hay dos formas principales de almacenar datos inmutables durante la ejecución del programa: const y static.

Constante (const) — es un valor inmutable que se evalúa en tiempo de compilación. Debe estar siempre tipificada explícitamente e inicializada con una expresión constante (que puede ser evaluada en el momento de la compilación). Las constantes no tienen una dirección fija en memoria y son "insertadas" por el compilador en los lugares de uso.

const MAX_ATTEMPTS: u32 = 5;

Variable estática (static) almacena un valor en una área específica de memoria durante toda la ejecución del programa. Su dirección es fija y puede ser mutable (usando static mut), pero se debe tener especial cuidado al acceder a ella debido a posibles condiciones de carrera en escenarios multihilo.

static APP_NAME: &str = "MyApp"; static mut COUNTER: u32 = 0;
  • Usa const cuando el valor debe ser conocido siempre en tiempo de compilación y no requiere almacenamiento global.
  • Usa static si se necesita un único lugar de almacenamiento en memoria al que todos los módulos tienen acceso, o si el valor no puede ser calculado en tiempo de compilación.

Pregunta capciosa

¿Cuál es la diferencia entre const y static en Rust? ¿Puede una variable estática referirse a un valor no constante?

Respuesta: La principal diferencia es el área de almacenamiento (lifetime): const no garantiza la existencia en memoria (es una sustitución de valor), mientras que static es un objeto que vive durante toda la ejecución del programa con una dirección fija.

A una variable estática solo se le puede asignar un valor conocido en tiempo de compilación:

let a = 42; // static INVALID: i32 = a; // ¡Error! Solo se permiten constantes.

Ejemplos de errores reales por no conocer los detalles del tema.


Historia

En un proyecto de servicio backend para distribución de carga, uno de los desarrolladores usó static mut para un contador compartido de accesos desde diferentes hilos, sin utilizar sincronización. Esto llevó a condiciones de carrera y resultados impredecibles — parte de los accesos simplemente se perdía. La solución fue usar tipos atómicos de std::sync::atomic, o Mutex.


Historia

Un joven desarrollador decidió llevar la cadena de saludo del usuario a una constante usando const, pero intentó vincularla al resultado de una función que se evalúa en el momento de la inicialización. El compilador dio un error porque el valor debe estar definido en tiempo de compilación. La razón es que la constante debe ser computable en compile-time, mientras que la función devuelve un valor en tiempo de ejecución.


Historia

En un proyecto antiguo reemplazaron todos los valores globales por static, olvidando que los literales de cadena con referencias utilizan el área de memoria del programa, y algunas declaraciones en realidad requerían solo la sustitución del valor: esto aumentó el tamaño del binario y complicó la gestión de memoria. Resultado — aumento del tiempo de inicio y fugas durante la carga dinámica de bibliotecas.