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的指针),因而产生报错。