Rust
The Drop Trait - Destructors in Rust
Sök…
Anmärkningar
Att använda Drop Trait betyder inte att det körs varje gång. Även om det kommer att köras när det går utanför räckvidden eller varva ner, kanske det inte alltid är fallet, till exempel när mem::forget
heter.
Det beror på att panik under avlindning får programmet att avbryta. Det kan också ha kompilerats med Abort on Panic
påslagen.
För mer information, kolla in boken: https://doc.rust-lang.org/book/drop.html
Enkel droppimplementering
use std::ops::Drop;
struct Foo(usize);
impl Drop for Foo {
fn drop(&mut self) {
println!("I had a {}", self.0);
}
}
Släpp för rengöring
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 ger dig möjlighet att skapa enkla och felsäkra mönster.
Släpp loggning för felsökning av Runtime Memory Management
Hantering av runtime-minne med Rc kan vara mycket användbart, men det kan också vara svårt att slå runt huvudet, särskilt om din kod är mycket komplex och en enda instans refereras av tiotals eller till och med hundratals andra typer i många omfattningar.
Att skriva en drop-egenskap som inkluderar println!("Dropping StructName: {:?}", self);
kan vara oerhört värdefullt för felsökning, eftersom det låter dig se exakt när de starka referenserna till en strukturinstans tar slut.