1. 变量定义
RUST在定义一个变量时,实际上把变量在逻辑上分成了两个部分:
let mxsm :String = String::from("mxsm");
- 变量声明语句定义了一个内存块,上面变量**
mxsm
**的声明定义一个内存块。 - 变量类型定义了内存块内容的格式,上面代码String表示了这块内存块的内容格式是String类型
- 变量初始化赋值则在内存块中写入初始化变量内容。上面就是将
mxsm
初始化内容写入对应的内存块中。
2. 所有权
说道所有权官方的给出的解释是:
- 所有权是一组规则,是一组规则约束,那么这组规则用来干什么呢?就是下面说的第二点
- 控制程序如何管理内存
所有权的设计是为了保证对变量进行正确的清理操作。
2.1. 所有权规则
所有权有如下三条规则:
- Rust中的每一个值都有一个拥有者
- 同一时间值只能有一个拥有者
- 当拥有者超出范围,值将会被删除
总结一下就是:所有权指变量内容的独占性。 如何理解这个独占性?我们通过下面的代码进行说明
fn main() {
let mxsm: String = String::from("mxsm rust"); //此时mxsm拥有内存块内容"mxsm rust"
let mxsm2 = mxsm; //此时mxsm1拥有内存块内容"mxsm rust"
println!("{}", mxsm); //编译报错,mxsm变量失去了拥有内存块的内容"mxsm rust"
}
内容的独占性也就是所有权规则里面说的:同一时间值只能有一个拥有者
上面代码中还涉及到了rust的move语义
2.2 move语义
所有权转移指的是变量内容在不同的内存块之间的转移(浅拷贝)。当变量内容转移到新的内存块,旧的内存块就失去了这个变量内容的所有权。由此可见,变量名实际仅代表一个内存块,内存块的变量内容与变量名是一个暂时关联关系,RUST定义这种关联关系为绑定。
备注:实现Copy trait的类型变量不做所有权转移操作,实现Copy trait的类型可通过栈拷贝完成变量内容赋值,清理也可以仅通过通常的调用栈返回完成。 例如基础类型i32, 结构体Duration等等
2.3 生命周期
Rust被设计成自动调用变量类型的drop以完成清理,对变量的生命周期跟踪成为一个必然的选择,在判断变量的生命周期终结的时候调用变量的drop函数。
-
Rust采用生命周期仅与变量名相关联的设计
struct RefTest