# Rust 中的引用

## 借用

* 在可变借用持续的时间内，不可再对这个变量进行借用
* 任何借用持续的时间内不能操作原变量
* 对借用的取值可以自动解引用，对借用的赋值需要手动解引用

## 多种引用

1. 解引用使用 \* 符号
2. 当 T 实现了 Deref 这个 Trait ，\* 符号调用 deref 函数返回的值就是解引用结果
3. \&T 是引用了 T 的一个结构体，Box `<T>` 也是一样，\* 可用来消除 & 或 Box<>
4. 一般解引用后的最终结果要是单层引用，而不能把所有权给出去，所以自己写 deref 在返回的所有权的变量前要加上 &，类似 &\*x，这么写是因为不能直接把自己的变量给出去改变所有权，所以会绕一圈
5. Option< T > 提供了方法直接对 T 进行引用相关操作，as\_ref, as\_deref
6. \&T 任意传入方法都不会影响到内存块所有权变更，保护内存不被随意释放
7. 形参传入方法会自动解引用到对应需要的类型
8. 引用包括 \&T, Box,Rc,Arc,Cell,指针, 都是定长的 size 大小，可指向所有的逻辑地址的大小
9. 不定长大小的为 Trait, \[T], 特征和切片是不定长的，切片可以看作是数组的特征。
10. 特征可以指代一个定长实体，使用特征就是通过特定入口使用定长实体，所以使用特征有出错的可能
11. 单从特征也无法推断出该特征所指代的实体的长度
12. rust 编译期间变量（都在栈内）都得是定长的，所以不能有特征变量，
13. 所以创建引用特征变量到对应的所有权实体，所有权实体可以使用 Box 放在堆里
