drop trait 用于在值超出范圍時(shí)釋放文件或網(wǎng)絡(luò)連接等資源。
drop trait 用于釋放Box <T> 指向的堆上的空間。
drop trait 用于實(shí)現(xiàn)drop() 方法,該方法對(duì)self 進(jìn)行可變引用。
下面來看一個(gè)簡(jiǎn)單的例子: 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");
}Rust 執(zhí)行上面示例代碼,得到以下結(jié)果 - Instances of Example type are created
Dropping the instance of Example with data : 20
Dropping the instance of Example with data : 10Shell 程序代碼說明 在Example 類型上實(shí)現(xiàn)了Drop trait ,并在Drop trait 的實(shí)現(xiàn)中定義了drop() 方法。 在main() 函數(shù)中,創(chuàng)建了Example 類型的實(shí)例,并且在main() 函數(shù)的末尾,實(shí)例超出了范圍。 當(dāng)實(shí)例移出作用域時(shí),Rust會(huì)隱式調(diào)用drop() 方法來刪除Example 類型的實(shí)例。 首先,它將刪除b1 實(shí)例,然后刪除a1 實(shí)例。
注意 : 不需要顯式調(diào)用drop() 方法。 因此,可以說當(dāng)實(shí)例超出范圍時(shí),Rust會(huì)隱式調(diào)用drop() 方法。
使用std::mem::drop盡早刪除值有時(shí),有必要在范圍結(jié)束之前刪除該值。如果想提前刪除該值,那么使用std::mem::drop 函數(shù)來刪除該值。 下面來看一個(gè)手動(dòng)刪除值的簡(jiǎn)單示例: 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");
}Rust 執(zhí)行上面示例代碼,得到以下結(jié)果 -
在上面的例子中,手動(dòng)調(diào)用drop() 方法。 Rust編譯器拋出一個(gè)錯(cuò)誤,不允許顯式調(diào)用drop() 方法。不是顯式調(diào)用drop() 方法,而是調(diào)用std::mem::drop 函數(shù)在值超出范圍之前刪除它。 std::mem::drop 函數(shù)的語法與Drop trait 中定義的drop() 函數(shù)不同。 std::mem::drop 函數(shù)包含作為參數(shù)傳遞的值,該值在超出范圍之前將被刪除。 下面來看一個(gè)簡(jiǎn)單的例子:
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");
}Rust 執(zhí)行上面的示例代碼,得到以下結(jié)果 - Dropping the instance of Example with data : Hello
Instances of Example type are created
Dropping the instance of Example with data : WorldShell 在上面的示例中,通過在drop(a1) 函數(shù)中將a1 實(shí)例作為參數(shù)傳遞來銷毀a1 實(shí)例。
|