Zoeken…


Opmerkingen

Het gebruik van de Drop Trait betekent niet dat deze elke keer wordt uitgevoerd. Hoewel het wordt uitgevoerd als je buiten bereik bent of ontspant, is het misschien niet altijd het geval, bijvoorbeeld wanneer mem::forget wordt aangeroepen.

Dit komt omdat een paniek tijdens het afrollen ertoe leidt dat het programma wordt afgebroken. Mogelijk is het ook gecompileerd met Abort on Panic ingeschakeld.

Bekijk het boek voor meer informatie: https://doc.rust-lang.org/book/drop.html

Eenvoudige drop-implementatie

use std::ops::Drop;

struct Foo(usize);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("I had a {}", self.0);
    }
}

Drop voor opruimen

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);
}

Met Drop kun je eenvoudige en faalveilige ontwerpen maken.

Drop Logging voor Runtime Memory Management Debuggen

Beheer van runtime-geheugen met Rc kan erg handig zijn, maar het kan ook moeilijk zijn om je hoofd eromheen te zetten, vooral als je code erg complex is en naar een enkele instantie wordt verwezen door tientallen of zelfs honderden andere typen in veel scopes.

Een Drop-eigenschap schrijven met println!("Dropping StructName: {:?}", self); kan enorm waardevol zijn voor foutopsporing, omdat u precies kunt zien wanneer de sterke verwijzingen naar een struct-instantie opraken.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow