O Trait Drop

Valores que implementam Drop podem especificar o código a ser executado quando saem do escopo:

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

Pontos de discussão:

  • Por que Drop::drop não recebe self?
    • Resposta curta: Se recebesse, std::mem::drop seria chamado no final do bloco, resultando em outra chamada para Drop::drop ocasionando um estouro de pilha.
  • Tente substituir drop(a) por a.drop().