集合或迭代器
drain()方法:核心功能是移除集合中指定范围的元素,同时保持集合的连续性,是一种比**多次调用remove()**更高效的批量处理方式
所有权
- 所有权和可变性是独立的
- 所有权完整性保护针对集合
- 集合需要保证所有元素位置有效
- 集合在内存中是连续的
- 结构体允许字段被转移走所有权
- 结构体字段具有独立性,布局在编译时可知
- 所有者离开作用域,值将被丢弃
变量和类型
ref和&- &用于创建引用
- &用于模式匹配时,行使的是解构操作(一般作用是隐式解引用)
- ref用于模式匹配,获取引用而不是获取所有权
'a : 'b表示'a>='bT: 'static:表示类型T内部字段要么没有引用,要么引用都是'static的trait My Trait: 'static或Box<dyn MyTrait + 'static>- 实现类型必须满足:
Self: 'static或者没有引用
- 实现类型必须满足:
(PathBuf, Path)、(String, str)和(BytesMut/Vec<u8>, &[u8]- Path,str都是DST类型
- PathBuf和String都是拥有所有权的
- 文件路径长度和字符串长度在编译时未知
&buf和&buf[..]的区别&buf获取整个数组的引用,类型是&[u8; N]或&Vec<u8>(固定大小数组)&buf[..]获取数组的切片引用,类型是&[u8](动态大小切片)
格式化输出语法
{[参数索引]:[填充字符][对齐方式][宽度][.精度][类型]}fmt::Formatter是一个功能强大的格式化缓冲区,可以输出到字符串、stdout、文件等
结构体
- Rust不允许将struct中某个字段标记为可变
- Rust中源文件(
.rs)隐性的视为一个模块,区别于mod的显式声明
闭包
- 根据闭包捕获环境方式可分为三种,注意区分闭包 捕获的环境变量和闭包的参数
FnOnce获取所有权FnMut获取可变引用Fn获取不可变引用
并发编程
- 并发编程主要有两种核心范式:共享状态并发和消息传递并发
std::thread::scope- 相当于
thread::spwan+thread::join,但是它们只能借用'static或者move变量 scope没有以上限制,有编译器的支持
- 相当于
Mutex和MutexGuardMutex是互斥锁本身MutexGuard指访问受互斥锁保护数据的“许可证”或“钥匙”
park()/unpark和sleep()park()/unpark()精准的控制线程的睡眠(park)与唤醒(unpark)sleep()基于时间自动唤醒,无法提前唤醒