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!("Suprimiendo {}", 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!("Saliendo del bloque B"); } println!("Saliendo del bloque A"); } drop(a); println!("Saliendo de la página principal"); }
This slide should take about 8 minutes.
- Ten en cuenta que
std::mem::drop
no es igual questd::ops::Drop::drop
. - Los valores se suprimen automáticamente cuando salen del ámbito.
- Cuando se elimina un valor, si implementa
std::ops::Drop
, se llamará a su implementaciónDrop::drop
. - También se suprimirán todos sus campos, independientemente de si implementa o no
Drop
. std::mem::drop
es solo una función vacía que toma cualquier valor. Es importante saber que toma la propiedad del valor, por lo que se descarta al final de su ámbito. Se trata de una forma sencilla de suprimir los valores de forma explícita antes que si se salen de su ámbito.- Esta acción puede ser útil para los objetos que trabajan con
drop
, como liberando bloqueos, cerrando archivos, etc.
- Esta acción puede ser útil para los objetos que trabajan con
Cuestiones de debate:
- ¿Por qué
Drop::drop
no aceptaself
?- Respuesta corta: si lo hiciera,
std::mem::drop
sería llamado al final del bloque, lo que daría como resultado otra llamada aDrop::drop
, ¡y un desbordamiento del stack!
- Respuesta corta: si lo hiciera,
- Prueba a sustituir
drop(a)
pora.drop()
.