Translate

sábado, 18 de noviembre de 2023

El Trait Drop en Rust


Los valores que implementan Drop pueden especificar el código que se ejecutará cuando salgan del alcance:

struct Droppable {

    name: &'static str,

}


impl Drop for Droppable {

    fn drop(&mut self) {

        println!("Dropping {}", self.name);

    }

}


fn main() {

    let a = Droppable { name: "a" };

    {

        let b = Droppable { name: "b" };

        {

            let c = Droppable { name: "c" };

            let d = Droppable { name: "d" };

            println!("Exiting block B");

        }

        println!("Exiting block A");

    }

    drop(a);

    println!("Exiting main");

}


Si ejecutamos esto tenemos: 

Exiting block B

Dropping d

Dropping c

Exiting block A

Dropping b

Dropping a

Exiting main


  • Tenga en cuenta que std::mem::drop no es lo mismo que std::ops::Drop::drop.
  • Los valores se eliminan automáticamente cuando salen del alcance.
  • Cuando se elimina un valor, si implementa std::ops::Drop, se llamará a su implementación Drop::drop.
  • Todos sus campos también se eliminarán, ya sea que implemente Drop o no.

std::mem::drop es solo una función vacía que toma cualquier valor. La importancia es que se apropia del valor, por lo que al final de su alcance se elimina. Esto lo convierte en una forma conveniente de eliminar valores explícitamente antes de que, de otro modo, saldrían del alcance.

Esto puede ser útil para objetos que realizan algún trabajo al soltarlos: liberar bloqueos, cerrar archivos, etc.