Key Points
- 所有权:一个值只能被一个变量所拥有,且同一个时刻只能有一个所有者,当所有者离开作用域,其拥有的值被丢弃,内存得到释放
- Move 语义:赋值或者传参会导致值 Move,所有权被转移,一旦所有权转移,之前的变量就无法访问
- Copy 语义:如果值实现了 Copy trait,赋值及传参就会使用 Copy 语义,相应的值会被按位拷贝,产生新的值。
所有权
多态实现
rc
生命周期
- 所有引用类型的参数都有独立的生命周期
'a, 'b
- 如果只有一个引用型输入,它的生命周期会赋给所有输出
- 如果有多个引用类型的参数,其中一个是 self,那么它的生命周期会赋给所有输出
Trait
- 不允许返回 Self,在 trait object 产生时,原来的类型会被抹去,没有 Self 信息。
- 不允许携带泛型参数,Rust 中带泛型的类型在编译时会做单态化,而 trait object 是运行时产物,无法兼容。
数据类型
凡是需要做资源回收的数据结构,且实现了 Deref/DerefMut/Drop,都是智能指针。
slices
|
|
HashMap
A hash map implemented with quadratic probing and SIMD lookup.
Closure
闭包的大小跟参数、局部变量都无关,只跟捕获的变量有关。
闭包是存储在栈上,并且除了捕获的数据外,闭包本身不包含任何额外函数指针指向闭包的代码。
泛型数据结构的逐步约束
|
|
Copy
is copy
原生类型:函数、不可变引用、裸指针,数组、元组 (如果其内部数据结构实现了 Copy)
- bool
- char
- i8
- u64
- i64
usize
fn()
- pointer*const String
- raw pointer*mut String
- raw pointer&[Vec<u8>]
- immutable reference&String
- immutable reference[u8; 4]
array(&str, &str)
tuple
not copy
可变引用、非固定大小的数据结构
- str - usized or dynamic sized type
[u8]
Vec<u8>
- String
&mut String
- mutable reference[Vec<u8>; 4]
- array | tuple with values that not Copy is not Copy(String, u32)
Futures
自引用结构 Self-Referential Structure
一旦被移动,原来的指针就会指向旧的地址。
Pin 的目的是,把 T 的内存位置锁住,从而避免移动后自引用类型带来的 invalid pointer 问题。