Rust Drop trait


drop trait用於在值超出範圍時釋放檔案或網路連線等資源。
drop trait用於釋放Box <T>指向的堆上的空間。
drop trait用於實現drop()方法,該方法對self進行可變參照。

下面來看一個簡單的例子:

struct Example  
{  
  a : i32,  
 }  
      impl Drop for Example  
{  
  fn drop(&mut self)  
  {  
    println!("Dropping the instance of Example with data : {}", self.a);  
  }  
}  
      fn main()  
{  
  let a1 = Example{a : 10};  
  let b1 = Example{a: 20};  
  println!("Instances of Example type are created");  
}

執行上面範例程式碼,得到以下結果 -

Instances of Example type are created
Dropping the instance of Example with data : 20
Dropping the instance of Example with data : 10

程式程式碼說明

  • Example型別上實現了Drop trait,並在Drop trait的實現中定義了drop()方法。
  • main()函式中,建立了Example型別的範例,並且在main()函式的末尾,範例超出了範圍。
  • 當範例移出作用域時,Rust會隱式呼叫drop()方法來刪除Example型別的範例。 首先,它將刪除b1範例,然後刪除a1範例。

注意 : 不需要顯式呼叫drop()方法。 因此,可以說當範例超出範圍時,Rust會隱式呼叫drop()方法。

使用std::mem::drop儘早刪除值

有時,有必要在範圍結束之前刪除該值。如果想提前刪除該值,那麼使用std::mem::drop函式來刪除該值。

下面來看一個手動刪除值的簡單範例:

struct Example  
{  
  a : String,  
}  
impl Drop for Example  
{  
  fn drop(&mut self)  
  {  
    println!("Dropping the instance of Example with data : {}", self.a);  
  }  
}  
fn main()  
{  
  let a1 = Example{a : String::from("Hello")};  
  a1.drop();  
  let b1 = Example{a: String::from("World")};  
  println!("Instances of Example type are created");  
}

執行上面範例程式碼,得到以下結果 -

在上面的例子中,手動呼叫drop()方法。 Rust編譯器丟擲一個錯誤,不允許顯式呼叫drop()方法。不是顯式呼叫drop()方法,而是呼叫std::mem::drop函式在值超出範圍之前刪除它。

std::mem::drop函式的語法與Drop trait中定義的drop()函式不同。 std::mem::drop函式包含作為引數傳遞的值,該值在超出範圍之前將被刪除。
下面來看一個簡單的例子:

 struct Example  
{  
  a : String,  
}  

impl Drop for Example  
{  
  fn drop(&mut self)  
  {  
    println!("Dropping the instance of Example with data : {}", self.a);  
  }  
}  

fn main()  
{  
  let a1 = Example{a : String::from("Hello")};  
  drop(a1);  
  let b1 = Example{a: String::from("World")};  
  println!("Instances of Example type are created");  
}

執行上面的範例程式碼,得到以下結果 -

Dropping the instance of Example with data : Hello
Instances of Example type are created
Dropping the instance of Example with data : World

在上面的範例中,通過在drop(a1)函式中將a1範例作為引數傳遞來銷毀a1範例。