Rust 基本类型
Rust 的标量类型(整型、浮点、布尔、字符)与复合类型(元组、数组)的表示、字面量与常见边界。
#type / concept
#status / growing
#tech / dev
#resource / rust
[!info] 关联笔记
- 所属 MOC:语言基础 · 学习路线
- 前置概念:程序结构
- 后续概念:变量与可变性、字符串、所有权、Vec 与 HashMap
- 容易混淆:String 与 &str、切片
Rust 基本类型
这个概念为什么出现
在谈所有权之前,必须先能稳定地描述数据:
- 整数到底多少位、有没有符号?
- 浮点比较为什么危险?
char为什么不是 C 的单字节?- 元组与数组分别解决什么聚合问题?
基本类型是编译器推断、字面量与 ABI 观感的地基。
[!abstract] 一句话理解 Rust 标量类型固定宽度且默认安全优先;元组聚合异构固定字段,数组聚合同构固定长度;更灵活的堆结构(
String/Vec)建立在这些基础与所有权之上。
最小可运行示例
场景:库存服务描述一件 SKU 的“静态规格卡”
商品中台要为 SKU 打印一张规格卡:价格分、是否上架、等级标签字符、尺寸三元组、近 7 日销量数组。
这些字段都适合基本类型,还不需要 Vec。
// 业务意图:用标量与复合类型描述 SKU 规格并格式化输出。
// 教学点:整型宽度、bool、char、tuple、array 的字面量与访问。
fn main() {
// 价格用分表示,避免过早用 f64 做货币
let price_cents: u32 = 1_990;
// 是否可售
let on_shelf: bool = true;
// char 是 Unicode 标量值,占 4 字节宽度语义,不是单字节
let grade: char = 'A';
// 元组:长宽高(cm),异构亦可,这里同为 u16
let dims_cm: (u16, u16, u16) = (30, 20, 12);
let (l, w, h) = dims_cm; // 解构
// 数组:近 7 日销量,长度属于类型
let sales_last_7d: [u32; 7] = [3, 5, 2, 8, 1, 0, 4];
let day0 = sales_last_7d[0];
println!(
"price={} on_shelf={} grade={} dims={}x{}x{} day0_sales={}",
price_cents, on_shelf, grade, l, w, h, day0
);
}
建议运行:
cargo run
期望输出:
price=1990 on_shelf=true grade=A dims=30x20x12 day0_sales=3
结合场景再看三个关注点
- 货币优先整数分:基本类型选择会影响业务正确性。
- 数组长度在类型里:
[u32; 7]与[u32; 30]是不同类型。 - 元组解构让“规格卡字段”读取清晰。
核心概念与准确模型
标量类型
| 类别 | 类型 | 要点 |
|---|---|---|
| 有符号整数 | i8…i128、isize | 可负;isize 随指针宽度 |
| 无符号整数 | u8…u128、usize | 索引常用 usize |
| 浮点 | f32、f64(默认推断常偏 f64) | 二进制浮点,相等比较需谨慎 |
| 布尔 | bool | true/false |
| 字符 | char | Unicode 标量值,字面量用单引号 |
整型字面量可用下划线:1_000_000。可用后缀:42u8。
复合类型
元组 (T, U, …)
- 固定长度、字段类型可不同
- 用
.0、.1或解构访问 - 空元组
()是 unit 类型,常作“无额外信息”的返回
数组 [T; N]
- 固定长度、元素同类型
- 默认栈上连续存储(大数组需注意栈大小)
- 越界索引会 panic(调试与运行时检查相关行为以当前实现/模式为准)
类型注解与推断
let x = 5; // 默认整型推断为 i32(在典型上下文中)
let y: u8 = 5;
let z = 5.0; // 典型默认 f64
上下文不足时编译器会要求注解。
设计动机
- 宽度显式:避免“平台 int 是多少”的隐式坑(
isize/usize是有意的指针宽类型) - 安全默认:溢出在 debug 默认 panic,release 默认 twos-complement 包装(仍可用
checked_*/saturating_*) - 复合类型轻量:小聚合不必立刻上 struct(struct 见后续)
边界情况与反直觉行为
char不是 UTF-8 字节:字符串索引应按字节/字符边界小心处理,见 字符串。- 浮点:
0.1 + 0.2 == 0.3可能为 false。 - 数组不等于切片:
[T; N]拥有数据;&[T]是借用视图。 - 整数溢出:业务代码对金额/计数优先
checked_或明确包装策略。
常见误区
[!warning] 常见误区:把 char 当 byte 错误理解:
char像 C 的char一字节。
正确模型:Unicode 标量值。
为何易错:关键词看起来像 C。
[!warning] 常见误区:用 f64 存钱 错误理解:小数用浮点最自然。
正确模型:货币用整数最小单位或十进制库。
为何易错:十进制字面量直觉。
工程实践
- 公共 API 显式写出关键整型宽度。
- 索引与长度用
usize。 - 超过栈友好大小的数据用
Vec等堆结构。 - 领域概念稳定后升级为
struct,而不是长元组。
本节总结
- 标量:整数、浮点、bool、char。
- 元组异构固定,数组同构固定。
- 类型选择有业务后果(钱、索引、文本)。
- 动态集合与字符串是下一层笔记。
自测题
概念题
- 为什么数组长度是类型的一部分?
代码推理题
(i32, f64, u8)能否整体赋给类型(i32, f64)的变量?
参考答案
- 使大小在编译期可知,便于布局与边界检查,并区分不同长度的类型。
- 不能,元组类型含长度与各字段类型,必须匹配。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| The Book — Data Types | 官方书 | 标量与复合类型 |
| std::primitive | 标准库 | 原始类型文档 |