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()
函式的末尾,範例超出了範圍。drop()
方法來刪除Example
型別的範例。 首先,它將刪除b1
範例,然後刪除a1
範例。注意 : 不需要顯式呼叫
drop()
方法。 因此,可以說當範例超出範圍時,Rust會隱式呼叫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
範例。