RustIntermedio28 oct 2025

¡El `const` de Rust: Un Ilusionista en Tu Código!

snippet.rust
struct MyDroppable(u8);

impl Drop for MyDroppable {
    fn drop(&mut self) {
        println!("Dropping MyDroppable({})", self.0);
    }
}

const CONST_DROPPABLE: MyDroppable = MyDroppable(1);

fn main() {
    println!("Start main");
    let _a = CONST_DROPPABLE;
    let _b = CONST_DROPPABLE;
    println!("End main");
}

¿Qué crees que imprime?

Salida Esperada

Start main
End main
Dropping MyDroppable(1)

⚠️ Salida Real

Start main
End main
Dropping MyDroppable(1)
Dropping MyDroppable(1)

¿Por qué pasa esto?

¡Prepárate para una sorpresa! 🎉 En Rust, un `const` no es una instancia única que vive en memoria estática como un `static`. ¡Es más bien una **constante de compilación**! Como un valor literal, se **copia** o **inlina** en cada lugar donde se usa. 👯‍♀️ Aquí la clave es el trait `Drop`. - Cuando asignamos `CONST_DROPPABLE` a `_a`, se crea una **copia** y `_a` se convierte en el dueño. - Lo mismo ocurre con `_b`: otra **copia** independiente se genera. El resultado: cada copia tiene su propia vida y, al salir de ámbito, ¡llama a su propio `drop()`! 👻 Por eso ves dos mensajes de "Dropping". Es como si cada vez que invocaras al `const`, Rust dijera: "¡Aquí tienes uno nuevo, fresquito del horno del compilador!". ¡Un verdadero WTF que te hace cuestionar la identidad de los objetos! 🤔

Conceptos relacionados

const-evaluationdrop-traitcompile-time