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

cor*_*zza 5 pointers ownership rust borrow-checker

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

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

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

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

类似的东西必须在x被丢弃时发生,因为drop期望一个可变的引用.

She*_*ter 7

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

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

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

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

  • 嗯,所以它更像是被移动到私人破坏位置,从那里调用`drop`. (2认同)