午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Rust Drop trait

 lichwoo 2021-07-10

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í)例。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章