Appearance
数据类型
Rust 是静态类型语言:每个值都有确定的类型,编译器在编译期完成检查。本章介绍标量类型与常见的复合类型(元组、数组、切片)。自定义的 struct / enum 在结构体与枚举中单独讲解。
本章标题沿用「数据结构」在入门语境下对「类型与复合数据形态」的统称;严格来说 Rust 文档中多称为「数据类型(types)」。
标量类型
标量类型表示单个值,包括整数、浮点、布尔与字符。
整数类型
有符号类型以 i 开头,无符号以 u 开头,后跟位数。常用宽度如下:
| 类型 | 大小 | 有符号范围(约) |
|---|---|---|
| i8 / u8 | 1 字节 | -128~127 / 0~255 |
| i16 / u16 | 2 字节 | 约 ±3 万 / 0~6 万 |
| i32 / u32 | 4 字节 | 约 ±21 亿 / 0~2³²-1 |
| i64 / u64 | 8 字节 | 更大 |
还有与指针同宽、依平台而定的 isize / usize:索引用 usize,与 C 互操作或 FFI 时常用 isize。
未写后缀的整数字面量,若上下文无法唯一推断,默认推断为 i32:
rust
let a: i32 = 42;
let b: u8 = 255;
let guess = 42; // 多为 i32可用后缀指定类型:42u8、20_i64。十六进制、八进制、二进制字面量同样可用,例如 0xff、0o77、0b1010。
整数除法
对整数使用 / 时结果是整数,向零截断(丢弃小数部分):
rust
fn main() {
println!("{}", 7 / 3); // 2
println!("{}", -7 / 3); // -2
}需要浮点结果时,先把操作数转为浮点类型(见下文类型转换)。
浮点类型
f32:32 位 IEEE 754。f64:64 位(默认):未标注的浮点字面量多为f64。
rust
let x: f32 = 3.14;
let y = 2.718; // f64浮点运算需留意精度与 NaN 等特殊值;金融等场景要谨慎选用类型与舍入策略。
布尔类型:bool
取值为 true 或 false,常用于条件与逻辑运算(见运算符)。
rust
let is_true = true;
let is_false: bool = false;字符类型:char
char 是 4 字节 Unicode 标量值,用单引号:
rust
let c: char = 'a';
let emoji = '😀';注意:字符串类型是 &str 与 String,与单个 char 不同;文本处理在后续章节展开。
复合类型
元组(tuple)
元组将多个值组合成一个类型,各元素类型可以不同,长度固定:
rust
fn main() {
let tup: (i32, f64, bool) = (42, 3.14, true);
let (x, y, z) = tup; // 解构
println!("x = {}, y = {}, z = {}", x, y, z);
println!("第一个元素: {}", tup.0); // 点号 + 索引
}单元类型 单元元组 () 表示「没有有意义的返回值」,函数无显式返回值时即 ()。
数组(array)
数组元素类型相同,长度在类型中固定 [T; N]:
rust
fn main() {
let arr: [i32; 5] = [1, 2, 3, 4, 5];
let arr2 = [0; 10]; // 10 个 0
println!("第一个元素: {}", arr[0]);
}使用越界索引会在运行时 panic(调试模式下可检查)。需要「可变长度、同类型序列」时,更常用 Vec<T>(标准库),在进阶内容中学习。
切片(slice)
切片 &[T] 是对一段连续元素的引用,长度在运行时确定。常从数组或 Vec 借出:
rust
fn main() {
let arr = [1, 2, 3, 4, 5];
let slice = &arr[1..3]; // 左闭右开,索引 1、2
println!("切片: {:?}", slice);
}范围写法:.. 全范围、a..b、a..=b(含右端)等。
类型转换:as
在不同数值类型之间可用 as 做显式转换(可能截断或改变符号):
rust
fn main() {
let x: i32 = 300;
let y: i8 = x as i8; // 截断
let z = 7_i32 / 3_i32;
let w = 7_f64 / 3_f64;
println!("{} {} {}", y, z, w);
}类型推导
Rust 会根据绑定、函数参数、结构体字段等上下文推断类型;推断不出时会报错并要求标注:
rust
fn main() {
let x = 5; // i32
let y = 3.14; // f64
let z = true; // bool
}复杂场景下适当写出类型能提高可读性并减少歧义。