Поиск…


замечания

Использование Drop Trait не означает, что он будет запускаться каждый раз. Хотя он будет работать при выходе из области видимости или разматывании, это может быть не всегда так, например, когда вызывается mem::forget .

Это связано с тем, что паника при размотке приводит к прерыванию программы. Он также может быть скомпилирован с включенным Abort on Panic .

Для получения дополнительной информации ознакомьтесь с книгой: https://doc.rust-lang.org/book/drop.html

Простая реализация

use std::ops::Drop;

struct Foo(usize);

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

Падение для очистки

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 позволяет создавать простые и отказоустойчивые проекты.

Отказоустойчивость для управления отладочной памятью

Управление памятью во время выполнения с помощью Rc может быть очень полезным, но также может быть сложно обернуть голову, особенно если ваш код очень сложный, и на один экземпляр ссылаются десятки или даже сотни других типов во многих областях.

Написание черты Drop, которая включает println!("Dropping StructName: {:?}", self); может быть очень ценным для отладки, поскольку он позволяет вам точно видеть, когда исчерпаны сильные ссылки на экземпляр структуры.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow