Buscar..


Observaciones

Usar el Rasgo de caída no significa que se ejecutará cada vez. Si bien se ejecutará cuando salga de alcance o se desenrolle, puede que no siempre sea así, por ejemplo, cuando se llama a mem::forget .

Esto se debe a que un pánico mientras se desenrolla hace que el programa se cancele. También podría haber sido compilado con el Abort on Panic activado.

Para obtener más información, consulte el libro: https://doc.rust-lang.org/book/drop.html

Implementación de Drop simple

use std::ops::Drop;

struct Foo(usize);

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

Gota para la limpieza

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 te permite crear diseños simples y a prueba de fallas.

Drop Logging para la depuración de la gestión de memoria en tiempo de ejecución

La administración de memoria en tiempo de ejecución con Rc puede ser muy útil, pero también puede ser difícil envolver la cabeza, especialmente si su código es muy complejo y una sola instancia es referenciada por decenas o incluso cientos de otros tipos en muchos ámbitos.

Escribiendo un rasgo de Drop que incluye println!("Dropping StructName: {:?}", self); puede ser inmensamente valioso para la depuración, ya que le permite ver con precisión cuándo se agotan las referencias sólidas a una instancia de estructura.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow