サーチ…


備考

Drop Traitを使用しても、それが毎回実行されるわけではありません。スコープを外したり解凍したりするときに実行されますが、 mem::forgetが呼び出されたときなど常にそうであるとは限りません。

これは、解凍中のパニックがプログラムを中止させるためです。 Abort on PanicAbort 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を使った実行時メモリ管理は非常に便利ですが、特にコードが非常に複雑で、多くのスコープで1つのインスタンスが数十から数百の他の型によって参照される場合は、頭を囲むのが難しい場合もあります。

println!("Dropping StructName: {:?}", self);を含むDrop特性をprintln!("Dropping StructName: {:?}", self);構造体インスタンスへの強い参照がなくなったときに正確に見ることができるので、デバッグに非常に価値があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow