📜  Rust – 掉落特性

📅  最后修改于: 2022-05-13 01:54:50.180000             🧑  作者: Mango

Rust – 掉落特性

Drop trait 让我们可以自定义当一个值即将超出范围时会发生什么。 Drop trait 对智能指针模式很重要。

Drop trait 功能在实现智能指针时使用。例如, Box 自定义 Drop 以释放盒子指向的堆上的空间。

Drop trait 可用于清除超出范围的值。

句法:

trait Drop {
fn drop(&mut self);
}

变量的删除顺序与它们的创建顺序相反,因此 d 在 c 之前删除。在 Rust 中,当我们的实例超出范围时,会自动调用 drop。



借助给定的示例,很容易理解 drop 方法的工作原理:

示例 1:

Rust
struct SmartPointer {
 data: String,
}
  
// implementing Drop trait
impl Drop for SmartPointer {
 fn drop(&mut self) {
 println!("Dropping SmartPointer with data `{}`!", self.data);
 }
}
fn main() {
 let _c = SmartPointer { data: String::from("my stuff") };
 let _d = SmartPointer { data: String::from("other stuff") };
 println!("SmartPointers created.");
 }


Rust
struct New {
 data: String,
}
impl Drop for New {
 fn drop(&mut self) {
 println!("Dropping New with data `{}`!", self.data);
 }
}
fn main() {
 let c = New { data: String::from("some data") };
 println!("New created.");
 drop(c);
 println!("New dropped before the end of main.");
}


Rust
struct GeeksforGeeks  
{  
  a : String,  
}  
impl Drop for GeeksforGeeks  
{  
  fn drop(&mut self)  
  {  
    println!("Dropping the instance of GeeksforGeeks with data : {}", self.a);  
  }  
}  
fn main()  
{  
  let value1 = GeeksforGeeks{a : String::from("This is ")};  
  drop(value1);  
  let _value2 = GeeksforGeeks{a: String::from("GFG Platform")};  
  
}


输出 1:

SmartPointers created.
Dropping SmartPointer with data `other stuff`!
Dropping SmartPointer with data `my stuff`!

示例 2:

struct New {
 data: String,
}
impl Drop for New {
 fn drop(&mut self) {
 println!("Dropping New with data `{}`!", self.data);
 }
}
fn main() {
 let c = New { data: String::from("some data") };
 println!("New created.");
 drop(c);
 println!("New dropped before the end of main.");
}

输出 2:

New created.
Dropping New with data `some data`!
New dropped before the end of main.

使用 std::mem::drop 提前删除值

std::mem::drop函数与 Drop trait 中的 drop 方法不同。我们可以通过在作用域结束之前传递我们想要删除的值来调用它。在 Rust 中,我们不能手动调用 Drop trait 的 drop 方法,但我们必须调用 std::mem::drop函数。

例子:

struct GeeksforGeeks  
{  
  a : String,  
}  
impl Drop for GeeksforGeeks  
{  
  fn drop(&mut self)  
  {  
    println!("Dropping the instance of GeeksforGeeks with data : {}", self.a);  
  }  
}  
fn main()  
{  
  let value1 = GeeksforGeeks{a : String::from("This is ")};  
  drop(value1);  
  let _value2 = GeeksforGeeks{a: String::from("GFG Platform")};  
  
}

在上面的例子中,我们手动调用了 drop() 方法。 Rust 编译器抛出一个错误,我们不允许显式调用 drop() 方法。我们没有显式调用 drop() 方法,而是调用 std::mem::drop函数在值离开作用域之前删除它。

std::mem::drop函数的语法与 Drop trait 中定义的 drop()函数不同。 std::mem::drop函数包含作为参数传递的值,该值在超出范围之前将被删除。

输出:

Dropping the instance of GeeksforGeeks with data : This is 
Dropping the instance of GeeksforGeeks with data : GFG Platform