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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow