繁体   English   中英

当拥有变量是不可变的时,析构函数如何调用`fn drop(&mut self)`调用?

[英]How is a destructor call `fn drop(&mut self)` call inserted when the owning variable is immutable?

我的理解是,当一个类型实现Drop的变量超出范围时,会插入对fn drop(&mut self)函数的调用,并将新创建的可变引用传递给超出范围的变量。

但是,如果变量是不可变的,那怎么可能呢?并且可变地借用它是违法的? 这是我正在谈论的一个例子:

fn main() {  
  let x = vec![1, 2, 3];
  let y = &mut x;
}

这会产生以下错误: 无法将不可变局部变量x作为预期的可变对象借用

x被丢弃时必须发生类似的事情,因为drop需要一个可变的引用。

变量的所有者在创建变量绑定时决定可变性,它不是值本身固有的:

fn main() {  
    let x = vec![1, 2, 3];
    let mut z = x;
    let y = &mut z;
}

当最后一个程序员命名的变量绑定放弃变量的所有权时,你可以想到丢弃。 神奇的Drop-fairy取得了你现在不需要的变量的所有权,并使用了一个可变的绑定。 然后Drop-fairy可以在做最后的魔法之前调用Drop::drop来释放物品本身占用的空间。

注意 Drop-fairy并不是真正的Rust概念。 RFC仍处于初步阶段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM