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!("Descartando {}", 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!("Saindo do bloco B"); } println!("Saindo do bloco A"); } drop(a); println!("Saindo do main"); }
This slide should take about 8 minutes.
- Observe que
std::mem::dropnão é o mesmo questd::ops::Drop::drop. - Os valores são descartados automaticamente quando saem do escopo.
- Quando um valor é descartado, se ele implementa
std::ops::Dropentão sua implementaçãoDrop::dropserá chamada. - Todas as seus campos serão descartadas também, independentemente de implementar
Drop. std::mem::dropé apenas uma função vazia que recebe qualquer valor. A importância é que ela assume a ownership do valor, então no final de seu escopo ele é descartado. Isso torna uma maneira conveniente de descartar explicitamente valores mais cedo do que eles sairiam do escopo.- Isso pode ser útil para objetos que fazem algum trabalho em
drop: liberando travas, fechando arquivos, etc.
- Isso pode ser útil para objetos que fazem algum trabalho em
Pontos de discussão:
- Por que
Drop::dropnão recebeself?- Resposta curta: Se recebesse,
std::mem::dropseria chamado no final do bloco, resultando em outra chamada paraDrop::dropocasionando um estouro de pilha.
- Resposta curta: Se recebesse,
- Tente substituir
drop(a)pora.drop().