类型系统概述
> 了解 Rust 类型系统的整体设计,理解静态类型与类型推断如何协同工作。
为什么需要类型系统?
类型是什么?
概念名称: 类型是数据的分类,告诉编译器数据的含义和可用操作。
想象你在整理房间:
没有类型的系统(动态类型):
┌─────────────────────────────────┐
│ 一个大箱子,什么都往里装 │
│ 用的时候才知道里面是什么 │
│ → 运行时错误 │
└─────────────────────────────────┘
Rust 的类型系统(静态类型):
┌─────────┬─────────┬─────────────┐
│ 书籍箱 │ 衣物箱 │ 厨具箱 │
│ 只能放书│ 只能放衣│ 只能放厨具 │
│ → 编译时就知道对不对 │
└─────────┴─────────┴─────────────┘为什么用它?
rust
▶ Run// 没有类型:运行时才发现错误
let x = "10";
let y = 20;
let result = x + y; // ❌ 运行时错误:字符串不能加数字
// 有类型:编译时就阻止
let x: i32 = 10;
let y: i32 = 20;
let result = x + y; // ✅ 编译通过,类型安全Rust 类型系统全景图
Rust 类型
│
├── 标量类型(Scalar)单个值
│ ├── 整数(integer): i32, u8, i64...
│ ├── 浮点数(float): f32, f64
│ ├── 布尔(boolean): bool
│ └── 字符(character): char
│
├── 复合类型(Compound)多个值组合
│ ├── 元组(tuple): (i32, String)
│ └── 数组(array): [i32; 5]
│
├── 字符串类型
│ ├── String(可增长字符串)
│ └── &str(字符串切片)
│
└── 其他类型(后续章节)
├── 结构体、枚举
├── 选项、结果
└── 智能指针...类型推断 vs 显式标注
概念名称: Rust 自动推断类型,但也可显式标注。
语法结构:
┌──────────────────────────────────────┐
│ let 变量 = 值; → 推断类型 │
│ let 变量: 类型 = 值; → 显式标注 │
│ │
│ let x = 42; → 推断为 i32 │
│ let x: i64 = 42; → 显式指定 i64 │
└──────────────────────────────────────┘最简示例
rust
▶ Runfn main() {
let x = 42; // 推断为 i32
let y: f64 = 3.14; // 显式指定 f64
println!("x={}, y={}", x, y);
}详细示例
rust
▶ Runfn main() {
// 类型推断
let x = 42; // i32
let y = 3.14; // f64
let s = "hello"; // &str
let b = true; // bool
println!("x={} (i32), y={} (f64), s={} (&str), b={} (bool)", x, y, s, b);
// 显式标注
let a: i64 = 42;
let c: u8 = 255;
println!("a={} (i64), c={} (u8)", a, c);
}关键代码说明:
| 代码 | 含义 | 为什么这样写 |
|---|---|---|
let x = 42 | 类型推断为 i32 | i32 是 Rust 默认整数类型 |
let y: f64 = 3.14 | 显式指定 f64 | 浮点数默认 f64,显式标注更清晰 |
let c: u8 = 255 | 无符号 8 位整数 | 适合存储 0-255 的值 |
小结
- Rust 是静态强类型语言,所有类型在编译时确定
- 类型推断让代码简洁,显式标注使类型意图更清晰
- 类型系统是防止运行时错误的第一道防线
- Rust 类型分为:标量类型、复合类型、自定义类型
练习题
详见:练习题