Variables Estáticas y Constantes
Las variables estáticas y constantes son dos formas diferentes de crear valores de ámbito global que no se pueden mover ni reasignar durante la ejecución del programa.
const
Las variables constantes se evalúan en tiempo de compilación y sus valores se insertan dondequiera que se utilicen:
const DIGEST_SIZE: usize = 3; const ZERO: Option<u8> = Some(42); fn compute_digest(text: &str) -> [u8; DIGEST_SIZE] { let mut digest = [ZERO.unwrap_or(0); DIGEST_SIZE]; for (idx, &b) in text.as_bytes().iter().enumerate() { digest[idx % DIGEST_SIZE] = digest[idx % DIGEST_SIZE].wrapping_add(b); } digest } fn main() { let digest = compute_digest("Hello"); println!("Digest: {digest:?}"); }
According to the Rust RFC Book these are inlined upon use.
Sólo se pueden llamar a las funciones marcadas como const
en tiempo de compilación para generar valores const
. Sin embargo, las funciones const
se pueden llamar en runtime.
static
Las variables estáticas vivirán durante toda la ejecución del programa y, por lo tanto, no se moverán:
static BANNER: &str = "Welcome to RustOS 3.14"; fn main() { println!("{BANNER}"); }
Tal y como se indica en el libro Rust RFC Book, no están insertadas y tienen una ubicación de memoria real asociada. Esto resulta útil para código insertado y no seguro. Además, la variable continúa durante toda la ejecución del programa. Cuando un valor de ámbito global no tiene ningún motivo para necesitar identidad de objeto, se suele preferir const
.
Dado que se puede acceder a las variables static
desde cualquier hilo, es necesario protegerlas, por ejemplo, mediante un comando Mutex
, o que sean accesibles usando código unsafe
. Veremos la mutación de datos estáticos en el capítulo sobre Rust inseguro.
- Menciona que
const
se comporta semánticamente de forma similar aconstexpr
de C++. - Por su parte,
static
se parece mucho más aconst
o a una variable global mutable de C++. static
proporciona la identidad del objeto: una dirección en la memoria y en el estado que requieren los tipos con mutabilidad interior, comoMutex<T>
.- No es muy habitual que se necesite una constante evaluada en runtime, pero es útil y más seguro que usar una estática.
- Datos del
thread_local
se pueden crear con la macrostd::thread_local
.
Tabla de Propiedades:
Propiedad | Estático | Constante |
---|---|---|
Tiene una dirección en la memoria | Sí | No (insertado) |
Vive durante toda la ejecución del programa | Sí | No |
Puede ser mutable | Sí (inseguro) | No |
Evaluado en tiempo de compilación | Sí (inicializado en tiempo de compilación) | Sí |
Insertado dondequiera que se utilice | No | Sí |