Rust
数据类型
标量类型
- 存在栈上
- 实现了 Copy trait, 赋值直接内存拷贝
char
4字节, 表示一个 Unicode 标量值
复合类型
元组
- 不同类型值组合
- 一旦声明, 长度不可变
- 存在栈上, 包含堆分配的数据时存指向堆的指针
数组
- 相同类型值组合
- 一旦声明, 长度不可变
- 存在栈上, 避免过长防止运行时栈溢出
所有权
离开作用域时, 堆上的值 和它在 栈上的所有者 都会被drop
借用
值的不可变引用被使用前, 不能创建它的可变引用
Slice
集合的不可变引用
字符串 Slice
- 类型是 &str
- 字符串切片的切片, 无法修改底层数据
字符串字面值
- 类型是 &str
- 硬编码在二进制文件的
只读数据段 - slice 的指针指向只读数据段
数组 Slice
- 类型有 &[i32]
集合
Vec
- 存放相同类型值
- 长度可变
- 借助 enum 存放多种类型
- 栈上存指针,长度,容量, 堆上存数据
- 赋值时, 拷贝栈上数据, 堆上所有权转移
String
- 有所有权
- 可变
- UTF8 编码
- 存在堆上
&String是拥有所有权字符串的切片,&mut String可以修改底层数据
提示
Unicode 为世界上所有字符分配了 码点, UTF8 决定 码点 在磁盘占几个字节
宏
1. println!()
- 不会获取参数所有权
{}中不支持字段访问或方法调用, 需要使用位置参数
println!("this is {}", config.query);
2. format!()
不会获取参数所有权
thiserror
便捷地创建自定义错误类型
anyhow
- 在向上抛出错误时, 可以通过 Context 添加业务描述
- 错误在线程间传递时, 已经包含
Send+Sync约束, 保证了线程安全 - 一次性错误消息支持插值
return Err("Missing attribute: {}", missing);