Rust删除特质trait实例分析

  • 值超出范围时, 删除特性用于释放文件或网络连接之类的资源。
  • 删除特性用于取消分配Box <T>指向的堆上的空间。
  • drop trait用于实现drop()方法, 该方法采用对自身的可变引用。

让我们看一个简单的例子:

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");
}

输出

Rust删除特质trait

在上面的示例中, 我们手动调用drop()方法。 Rust编译器会引发错误, 不允许我们显式调用drop()方法。我们没有显式调用drop()方法, 而是调用std :: mem :: drop函数在该值超出作用域之前将其删除。

  • std :: mem :: drop函数的语法与Drop特性中定义的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

在上面的示例中, 通过将a1实例作为参数传递给drop(a1)函数来销毁a1实例。


微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?