El Trait Drop

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

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");
}

Cuestiones de debate:

  • ¿Por qué Drop::drop no acepta self?
    • Respuesta corta: si lo hiciera, se llamaría a std::mem::drop al final del bloque, lo que daría como resultado otra llamada a Drop::drop y un desbordamiento de la stack.
  • Prueba a sustituir drop(a) por a.drop().