E0506: Rust借用机制引发的一个小bug

1. 错误代码

fn main() {
    let mut x = 5;
    let y = &x;
    println!("{}{}", x, y);
    x = 7;
    println!("{}{}", x, y);
}

2. 解读

这里我们在借用被遗弃之前,对原来的变量进行了移动,这在rust中数不允许的。这段代码里,我们在最后一次使用y之前,把7移动给x了,因而就发生了报错。我认为这个行为可以用生命周期来解释:

在Rust中,我们只需要保证:

这样做的目的无疑是防止悬空引用。另外:

Rust的引用是绑定在数据上的而不是变量上。

这里我们把y绑定在了数据5上,我们把7移动给x之后5就失去了所有者,此时推断5被释放,这时根据上面的规则,就不能再使用y了。 其实这个问题是我在写链表的时候发现的,问题代码如下:

#![allow(unused)]
fn main() {
let wraped_ptr = self.head.clone();  // 辅助指针
wraped_ptr = wraped_ptr.as_ref().unwrap().borrow().next.clone();
}

这里会和给出的代码报一样的错,原因是:我们在右边临时借用了wraped_ptr所指向的数据,此时它的生命周期是本行。然而我们在本行内修改了wraped_ptr的值,这里编译器会推断出wraped_ptr所拥有的数据被释放(就是原来的指针变成了next的指针),因而产生报错。