Rust中的借用规则
let num=1;
在这句代码对应的内存图
-
let mut num=1
num本质上一片内存,这片内存一定可以读,只有声明mut的时候,这片内存才可以被写。 为了突出mut关键字的特别,我们在「条目1」的基础上改进内存图。
-
让我们加入引用,观察此时的内存图
-
引用的特性:不可变引用对不会“加锁”,可变引用会“加锁”;这里“加锁”是指Rust编译器认为:一个变量被可变引用之后,可变引用会对该变量产生占用,直到可变引用被消费。这个“占据”或者“加锁”让我们用图形来表示。
-
有人会提出疑问了:如果「不可变引用a」已经独占num的引用通道 「可变引用b」为什么会被允许建立。答案是,「不可变引用a」建立引用关系后该没有没有被使用,独占效应是没有启用的。让我们看一下以下使用了「不可变引用a」的代码就知道了。
- 「不可变引用」的声明和消费之间,其实也会排斥「可变引用」的,但是却能容忍其他可变引用存在,因为读和读之间,不会产生任何竞争,读的过程中,却会害怕被该写导致脏读或者幻读。
综上,其实Rust中看起来很复杂借用检查规则,总结起来就是一条:「可变量引用」在声明和消费之间的不允许其他引用建立;「不可变量引用」在声明和消费之间会排斥「可变引用」。另外我们也可以了解到,Rust编译器在鼓励我们一个引用的声明和消费之间,不要隔得太远,尽量即刻声明即刻消费。