所有权
什么是所有权 ownership? 这个概念在之前的 C/C++ 以及 Python 等编程语言中, 并没有被太多的强调,
在 Rust 中, 所有权相关的有三个部分:
- 变量的值指的是它所占用的内存区域, 有一个对应的变量名指代该内存区域, 该变量是该内存区域的所有者
- 每个值有且只有一个属主/所有者, 一个资源只能一个所有者
- 当所有者超出作用域时, 这个值被释放 (drop)
所有权的问题会出现在哪里
在函数间传递对象
在函数调用时, 传递参数的方法有:
- 值传递
- 复制旧的对象
- 转移旧的对象
- 指针/引用, 传递一个内存地址
在结构体中保存对象
- 存储值的引用或指针
- 引用的有效性
- 值本身已经被释放了, 但是还保留有引用指向它
- 存储值本身
- 多个对象如何共享同一个值
缓解所有权的限制
上面提到了所有权的概念, 可以发现它的规则很严格, 如果只使用这样的方式来编程, 将极为受限, 为此, Rust 引入了另外的规则来缓限这样的限制, 给编写代码提供便利:
- 可以将值从一个变量移到另一个变量上, 用于重新安排
- 对于基本的值, 比如整数, 布尔值, char 等, 可以直接完整地拷贝它的值, 因为这样的值结构简单高效, Copy trait
- 可以完整地拷贝一个值, 包括它内部管理的堆内存等, 这是深拷贝, Clone trait
- 标准库提供了引用计数容器, Rc及 Arc, 这样多个变量可以拥有一个值; 当最后一个变量被释放后, 它们拥有的值也会被释放
- 可以使用 borrow reference (借用), 引用并不会改变值的拥有者
我们接下来依次介绍以上几个方面的内容.