Soltar

El rasgo Drop solo tiene un método: drop, que se llama automáticamente cuando un objeto sale del ámbito. El uso principal del rasgo Drop es liberar los recursos que posee la instancia implementadora.

Box, Vec, String, File y Process son algunos ejemplos de tipos que implementan el rasgo Drop para liberar recursos. El rasgo Drop también se puede implementar manualmente para cualquier tipo de datos personalizados.

El siguiente ejemplo agrega una impresión a la consola a la función drop para anunciar cuándo se llama.

struct Soltable {
    nombre: &'static str,
}

// Esta implementación trivial de `drop` agrega una impresión a la consola.
impl Drop for Soltable {
    fn drop(&mut self) {
        println!("> soltando {}", self.nombre);
    }
}

fn main() {
    let _a = Soltable { nombre: "a" };

    // block A
    {
        let _b = Soltable { nombre: "b" };

        // block B
        {
            let _c = Soltable { nombre: "c" };
            let _d = Soltable { nombre: "d" };

            println!("Saliendo del bloque B");
        }
        println!("Acabo de salir del bloque B");

        println!("Saliendo del bloque A");
    }
    println!("Acabo de salir del bloque A");

    // La variable se puede soltar manualmente usando la función `drop`
    drop(_a);
    // TODO ^ Intenta comentar esta línea

    println!("fin de la función main");

    // *no* de hara `drop` de `_a` de nuevo aquí, porque ya ha se hizo (manualmente)
    // `drop`
}