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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow