Suche…


Bemerkungen

Die Verwendung der Drop-Eigenschaft bedeutet nicht, dass sie jedes Mal ausgeführt wird. Es wird zwar ausgeführt, wenn der Gültigkeitsbereich verlassen oder abgewickelt wird. Dies kann jedoch nicht immer der Fall sein, beispielsweise wenn mem::forget aufgerufen wird.

Dies liegt daran, dass eine Panik während des Abwickelns dazu führt, dass das Programm abgebrochen wird. Möglicherweise wurde sie auch mit Abort on Panic kompiliert.

Weitere Informationen finden Sie im Buch: https://doc.rust-lang.org/book/drop.html

Einfache Drop-Implementierung

use std::ops::Drop;

struct Foo(usize);

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

Drop für die Bereinigung

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

Mit Drop können Sie einfache und ausfallsichere Designs erstellen.

Drop Logging für das Debugging von Runtime Memory Management

Die Laufzeitspeicherverwaltung mit Rc kann sehr nützlich sein, aber es kann auch schwierig sein, den Kopf herumzureißen, insbesondere wenn Ihr Code sehr komplex ist und eine einzelne Instanz in vielen Bereichen von Dutzenden oder sogar Hunderten anderer Typen referenziert wird.

Schreiben einer Drop-Eigenschaft, die println!("Dropping StructName: {:?}", self); kann für das Debugging von unschätzbarem Wert sein, da Sie genau sehen können, wann die starken Verweise auf eine Strukturinstanz ausgehen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow