Rust
Die Drop-Eigenschaft - Destruktoren in Rust
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.