はじめに
この実験では、Rust におけるDropトレイトの使用方法を調べます。このトレイトは、オブジェクトがスコープ外になると自動的に呼び出され、オブジェクトが所有するリソースを解放するために使用されます。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使用できます。たとえば、
main.rsを使用して、rustc main.rs &&./mainでコンパイルして実行できます。
Drop
Dropトレイトには 1 つのメソッドしかありません。それはdropで、オブジェクトがスコープ外になると自動的に呼び出されます。Dropトレイトの主な用途は、実装クラスが所有するリソースを解放することです。
Box、Vec、String、File、およびProcessは、リソースを解放するためにDropトレイトを実装する型のいくつかの例です。Dropトレイトは、任意のカスタムデータ型に対しても手動で実装することができます。
次の例では、drop関数にコンソールへの出力を追加して、それが呼び出されたときに通知します。
struct Droppable {
name: &'static str,
}
// `drop` のこの単純な実装は、コンソールへの出力を追加します。
impl Drop for Droppable {
fn drop(&mut self) {
println!("> Dropping {}", self.name);
}
}
fn main() {
let _a = Droppable { name: "a" };
// ブロック A
{
let _b = Droppable { name: "b" };
// ブロック B
{
let _c = Droppable { name: "c" };
let _d = Droppable { name: "d" };
println!("Exiting block B");
}
println!("Just exited block B");
println!("Exiting block A");
}
println!("Just exited block A");
// 変数は `drop` 関数を使用して手動で破棄できます
drop(_a);
// TODO ^ Try commenting this line
println!("end of the main function");
// `_a` はここでは再度 `drop` されません。既に(手動で)`drop` されているためです
}
まとめ
おめでとうございます!あなたは Drop 実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習してください。