Rust
The Drop Trait - Destructors in Rust
Ricerca…
Osservazioni
Usare il Drop Trait non significa che verrà eseguito ogni volta. Mentre funzionerà quando si esce dal campo di applicazione o si srotola, potrebbe non essere sempre il caso, ad esempio quando si chiama mem::forget
.
Questo perché il panico durante lo svolgimento causa l'interruzione del programma. Potrebbe anche essere stato compilato con Abort on Panic
attivato.
Per maggiori informazioni consulta il libro: https://doc.rust-lang.org/book/drop.html
Semplice implementazione Drop
use std::ops::Drop;
struct Foo(usize);
impl Drop for Foo {
fn drop(&mut self) {
println!("I had a {}", self.0);
}
}
Drop for Cleanup
use std::ops::Drop;
#[derive(Debug)]
struct Bar(i32);
impl Bar {
fn get<'a>(&'a mut self) -> Foo<'a> {
let temp = self.0; // Since we will also capture `self` we..
// ..will have to copy the value out first
Foo(self, temp) // Let's take the i32
}
}
struct Foo<'a>(&'a mut Bar, i32); // We specify that we want a mutable borrow..
// ..so we can put it back later on
impl<'a> Drop for Foo<'a> {
fn drop(&mut self) {
if self.1 < 10 { // This is just an example, you could also just put..
// ..it back as is
(self.0).0 = self.1;
}
}
}
fn main() {
let mut b = Bar(0);
println!("{:?}", b);
{
let mut a : Foo = b.get(); // `a` now holds a reference to `b`..
a.1 = 2; // .. and will hold it until end of scope
} // .. here
println!("{:?}", b);
{
let mut a : Foo = b.get();
a.1 = 20;
}
println!("{:?}", b);
}
Drop consente di creare design semplici e sicuri.
Drop Logging per il debug della gestione della memoria di runtime
La gestione della memoria run-time con Rc può essere molto utile, ma può anche essere difficile da comprendere, specialmente se il codice è molto complesso e una singola istanza è referenziata da decine o addirittura da centinaia di altri tipi in molti ambiti.
Scrivere una caratteristica di caduta che include println!("Dropping StructName: {:?}", self);
può essere estremamente utile per il debug, in quanto consente di vedere con precisione quando si esauriscono i forti riferimenti a un'istanza di struct.