5

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

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

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

这会产生以下错误:不能x像预期的那样借用不可变的局部变量。

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

4

1 回答 1

8

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

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

当最后一个程序员命名的变量绑定放弃该变量的所有权时,您可以将丢弃视为发生。神奇的 Drop-fairy 拥有您现在不需要的变量的所有权,并使用可变绑定。然后 Drop-fair 可以Drop::drop在执行最后的魔法之前调用以释放项目本身占用的空间。

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

于 2015-07-23T21:27:45.543 回答