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谢谢。我有一本关于生命的书,你可能会感兴趣!