5. 所有权
5.1 什么是所有权
5.1.1 栈(Stack)与堆(Heap)
5.1.2 所有权规则
5.1.3 变量作用域
5.1.4 String 类型
String
类型可进行修改,而字符串字面值是不可以的!(区别在于二者对内存的处理,前者在堆中分配内存、后者在栈中分配内存)
5.1.5 内存与分配
5.1.6 变量与数据交互的方式(一):移动(move,直接转移)
5.1.7 变量与数据交互的方式(二):克隆(clone,深复制)
5.1.8 只在栈上的数据:拷贝(对于实现了 Copy trait 的已知大小的类型)
5.1.9 所有权与函数
- 向函数传递值可能会移动或者复制:对于实现了
copy
trait 的是复制,否则为转移!
5.1.10 返回值与作用域
5.2 引用与借用
- 在任意给定时间,下面情况只能存在一种:1、要么 只能有一个可变引用;2、要么 只能有多个不可变引用
- 引用必须总是有效的(不能制造悬垂引用)
5.2.1 引用(&ref)
5.2.2 可变引用(&mut ref)
5.2.3 悬垂引用(Dangling References)
5.3 Slice 类型(引用类型,没有所有权)
5.3.1 用 Slice 返回 String 的子串
5.3.2 字符串 Slice
5.3.3 字符串字面值就是 slice(牢记此特性!)
5.3.4 字符串 slice 作为参数(而不是将 String 引用作为参数)
- 传入 slice 作为参数:
my_fn(&my_string[idx1..idx2])
5.3.5 其他类型的 slice