Pointers 当所属变量不可变时,如何插入析构函数调用'fn drop(&;mut self)`调用?

Pointers 当所属变量不可变时,如何插入析构函数调用'fn drop(&;mut self)`调用?,pointers,rust,ownership,borrow-checker,Pointers,Rust,Ownership,Borrow Checker,我的理解是,当类型实现Drop的变量超出范围时,将插入对fn Drop(&mut self)函数的调用,并将新创建的可变引用传递给超出范围的变量 然而,如果变量是不可变绑定的,并且可变地借用它是非法的,那么这怎么可能呢?下面是我所说的一个例子: fn main() { let x = vec![1, 2, 3]; let y = &mut x; } 这将产生以下错误:无法按预期借用可变的局部变量x 当x将被删除时,也会发生类似的情况,因为drop需要一个可变的引用。创建变量

我的理解是,当类型实现
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;
}
当最后一个名为variable binding的程序员放弃变量的所有权时,您可以将删除视为发生。神奇的Drop fairy拥有您现在不需要的变量的所有权,并使用可变绑定。然后Drop fairy可以调用
Drop::Drop
,然后再执行最后一个魔术来释放物品本身占用的空间


请注意,Drop fairy还不是一个真正的生锈概念。RFC仍处于非常初步的阶段

您可以说该值被移动到
drop
的参数中。就像你可以将
x
移动到
z
,你也可以将它移动到
drop
。@KerrekSB,除了drop通过引用而不是通过值接收接收器,所以没有任何东西被移动到
drop::drop
.Hm,所以它更像是移动到了一个私人销毁位置,从其中调用
drop
。@Shepmaster谢谢。我有一本关于生命的书,你可能会感兴趣!