Rust教學
Rust下載和安裝
Rust簡介
Rust Hello World
Rust的特點
Rust註釋
Rust開發環境安裝
Rust文檔
Rust第一個程序
Rust格式化打印
Rust調試
Rust顯示
測試用例:列表
Rust格式化
Rust原語
Rust常量和運算符
Rust元組
Rust數組和切片
Rust自定義類型
Rust結構
Rust可視性
Rust枚舉
Rust常量
Rust變量綁定
Rust變量綁定-可變性
Rust變量綁定-範圍和陰影
Rust變量綁定-聲明
Rust類型轉換
Rust類型轉換 - 字面量
Rust類型轉換-推導
Rust類型轉換 - 別名
Rust表達式
Rust if/else語句
Rust循環
Rust嵌套和標籤
Rust while循環
Rust for和範圍
Rust匹配/match
Rust匹配析構元組
Rust解構枚舉
Rust指針和引用
Rust解構結構
Rust Guards
Rust綁定
Rust if let
Rust while let
Rust函數
Rust方法
Rust閉包
Rust捕捉
Rust作爲輸入參數
Rust匿名類型
Rust輸入函數
Rust作爲輸出參數
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
實例。