2.2 数据类型:标量类型与复合类型
在 Rust 中,数据类型是静态且强类型的,这意味着所有变量的类型在编译时都必须明确。Rust 的类型系统主要分为两大类:标量类型和复合类型。理解这两类类型是掌握 Rust 语法的基础。
标量类型
标量类型代表一个单一的值。Rust 有四种主要的标量类型:整数、浮点数、布尔值和字符。
1. 整数类型
整数类型分为有符号(i)和无符号(u)两种,每种都有不同的长度(位数)。
| 长度 | 有符号 | 无符号 |
|---|---|---|
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| arch | isize | usize |
- 有符号整数:可以存储正数和负数,范围从
-(2^(n-1))到2^(n-1) - 1。 - 无符号整数:只能存储正数,范围从
0到2^n - 1。 isize和usize:其长度取决于程序运行的计算机架构(64 位系统上为 64 位,32 位系统上为 32 位)。通常用于索引集合。
默认类型:整数类型默认为 i32。
let a: i8 = -128; // 有符号 8 位整数
let b: u32 = 255; // 无符号 32 位整数
let c: isize = 100; // 与架构相关的有符号整数
let d = 10; // 默认类型:i32
2. 浮点类型
Rust 有两种浮点数类型:f32(32 位单精度)和 f64(64 位双精度)。默认类型是 f64,因为现代 CPU 上其速度与 f32 相近,但精度更高。
let x = 2.0; // f64 (默认)
let y: f32 = 3.0; // f32
3. 布尔类型
布尔类型(bool)只有两个值:true 和 false。主要用于条件判断。
let is_rust_fun: bool = true;
let is_difficult = false; // 类型推断为 bool
4. 字符类型
Rust 的 char 类型代表一个 Unicode 标量值,这意味着它可以表示比 ASCII 更多的字符(如中文、日文、emoji 等)。char 类型使用单引号定义,占用 4 个字节。
let letter: char = 'A';
let emoji: char = '😊';
let chinese_char: char = '中';
复合类型
复合类型可以将多个值组合成一个类型。Rust 有两种原生的复合类型:元组和数组。
1. 元组 (Tuple)
元组是一个将多个不同类型的值组合在一起的复合类型。元组的长度是固定的,一旦声明,就不能增长或缩小。
- 创建元组:使用圆括号
()包含一组值。 - 访问元组元素:可以使用点号
.后跟索引来访问,或者通过模式匹配解构。
// 创建元组
let tup: (i32, f64, char) = (500, 6.4, 'R');
// 通过索引访问
let first = tup.0; // 500
let second = tup.1; // 6.4
// 解构元组
let (x, y, z) = tup;
println!("The values are: {}, {}, {}", x, y, z); // 输出:The values are: 500, 6.4, R
2. 数组 (Array)
数组是一个将多个相同类型的值组合在一起的复合类型。与元组类似,数组的长度也是固定的。
- 创建数组:使用方括号
[]包含一组值,或者使用[初始值; 长度]的语法。 - 访问数组元素:使用方括号
[]加索引访问,索引从 0 开始。
// 创建数组
let arr: [i32; 5] = [1, 2, 3, 4, 5];
// 使用初始值创建数组(所有元素相同)
let same = [3; 5]; // 等同于 [3, 3, 3, 3, 3]
// 访问数组元素
let first = arr[0]; // 1
let third = arr[2]; // 3
数组越界访问:如果尝试访问超出数组长度的索引,Rust 会在运行时抛出 panic,确保内存安全,避免访问无效内存。
let arr = [1, 2, 3];
let invalid = arr[10]; // 程序会 panic 并退出
总结
| 类型类别 | 类型名称 | 示例 | 说明 |
|---|---|---|---|
| 标量 | 整数 | let a: i32 = 42; | 有符号/无符号,不同长度 |
| 标量 | 浮点数 | let b: f64 = 3.14; | 单精度/双精度 |
| 标量 | 布尔 | let c: bool = true; | true 或 false |
| 标量 | 字符 | let d: char = 'R'; | Unicode 字符,4 字节 |
| 复合 | 元组 | let e: (i32, f64) = (10, 2.5); | 固定长度,可包含不同类型 |
| 复合 | 数组 | let f: [i32; 3] = [1, 2, 3]; | 固定长度,所有元素类型相同 |
掌握这些基础类型是编写 Rust 程序的起点。在后续章节中,我们将学习如何利用这些类型构建更复杂的数据结构。
