Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Drop トレイト / スコープと解放
DropトレイトはRustのRAII(Resource Acquisition Is Initialization)パターンを実現する仕組みで、値がスコープを抜けるときに自動的にクリーンアップ処理を実行します。
構文
// Dropトレイトの実装
impl Drop for 型名 {
fn drop(&mut self) {
// スコープを抜けるときに自動呼び出されます。
}
}
// 早期解放(std::mem::drop関数を使います。)
drop(変数);
概要一覧
| 項目 | 概要 |
|---|---|
| Drop::drop() | 値がスコープを抜けるときに自動的に呼ばれるメソッドです。直接呼び出すことはできません。 |
| drop()関数 | 標準ライブラリのdrop()関数で所有権を受け取り、即座にスコープを終了させます。 |
| 解放順序 | 変数は宣言の逆順(後に宣言したものが先)に解放されます。 |
| RAIIパターン | ファイルハンドル・ロック・ネットワーク接続などのリソース管理に活用されます。 |
サンプルコード
struct Resource {
name: String,
}
impl Drop for Resource {
fn drop(&mut self) {
println!("{}を解放しました", self.name);
}
}
fn main() {
let r1 = Resource { name: String::from("リソース1") };
{
let r2 = Resource { name: String::from("リソース2") };
let r3 = Resource { name: String::from("リソース3") };
println!("内側のスコープです");
} // r3, r2の順で解放されます(宣言の逆順)。
println!("外側のスコープに戻りました");
let r4 = Resource { name: String::from("リソース4") };
drop(r4); // 早期解放します。
println!("r4は解放済みです");
} // r1が解放されます。
概要
Dropトレイトはメモリだけでなく、ファイルのクローズ・Mutexのロック解除・ネットワーク接続の切断など、あらゆるリソース管理に使用できます。Rustの標準ライブラリの多くの型(File・MutexGuard など)がDropを実装しています。
Drop::drop()メソッドを直接呼び出すことはできません。早期解放が必要な場合は必ず標準ライブラリの『drop()』関数を使用してください。
CopyトレイトとDropトレイトは同一の型に共存できません。Copyを実装したい場合はClone / Copyトレイトを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。