2.2 数据类型:标量与复合类型
Rust 是一门静态类型语言,这意味着在编译时就必须知道每个变量的类型。不过,Rust 编译器通常能根据上下文自动推断出类型,因此你不必总是显式写出类型标注。
Rust 的数据类型分为两大类:标量类型(scalar)和复合类型(compound)。标量类型表示单一值,而复合类型可以将多个值组合成一个类型。
标量类型
Rust 提供了四种主要的标量类型:整数、浮点数、布尔值和字符。
整数类型
整数是没有小数部分的数字。Rust 支持有符号(signed)和无符号(unsigned)整数,长度从 8 位到 128 位不等:
- 有符号:
i8,i16,i32,i64,i128,isize - 无符号:
u8,u16,u32,u64,u128,usize
其中 isize 和 usize 的大小取决于程序运行的系统架构(32 位或 64 位)。
如果不显式指定类型,整数字面量默认为 i32。例如:
let x = 42; // i32
let y: u8 = 255; // 显式指定为 u8
浮点数类型
Rust 有两种浮点类型:f32 和 f64,分别对应单精度和双精度浮点数。默认情况下,浮点字面量是 f64:
let a = 3.14; // f64
let b: f32 = 2.718;
布尔类型
布尔类型 bool 只有两个可能的值:true 和 false:
let is_rust_cool = true;
字符类型
Rust 的 char 类型表示一个 Unicode 标量值,用单引号括起来。它不仅包括 ASCII 字符,还支持 emoji 等 Unicode 字符:
let c = 'z';
let emoji = '🚀';
注意:char 是 32 位大小,足以容纳任何有效的 Unicode 字符。
复合类型
复合类型可以将多个值组合为一个类型。Rust 提供了两种原生复合类型:元组(tuple)和数组(array)。
元组
元组将多个不同类型的值组合成一个单一类型。一旦声明,元组的长度是固定的。
let tup: (i32, f64, char) = (500, 6.4, 'a');
可以通过模式解构或点号加索引来访问元组中的元素:
let (x, y, z) = tup;
println!("y is {}", y);
let second = tup.1; // 访问第二个元素(从 0 开始)
数组
数组用于存储多个相同类型的元素,其长度在编译时确定且不可更改:
let a = [1, 2, 3, 4, 5];
let b: [i32; 5] = [1, 2, 3, 4, 5]; // 显式指定类型和长度
访问数组元素使用方括号语法:
let first = a[0];
需要注意的是,Rust 在运行时会对数组索引进行边界检查。如果访问越界,程序会 panic 并终止,从而避免缓冲区溢出等安全问题。
小结
Rust 的类型系统在保证安全的同时提供了丰富的表达能力。理解标量类型和复合类型的基本用法,是编写正确、高效 Rust 代码的重要基础。在后续章节中,我们还会接触到更多类型,如字符串、向量和结构体等。