当所属变量不可变时,如何插入析构函数调用 `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 来释放物品本身占用的 space。

注意 Drop-fairy 还不是真正的 Rust 概念。该 RFC 仍处于非常初级的阶段。