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::drop
nĂŁ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::Drop
então sua implementaçãoDrop::drop
serå 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::drop
nĂŁo recebeself
?- Resposta curta: Se recebesse,
std::mem::drop
seria chamado no final do bloco, resultando em outra chamada paraDrop::drop
ocasionando um estouro de pilha.
- Resposta curta: Se recebesse,
- Tente substituir
drop(a)
pora.drop()
.