Skip to content

数据类型

Rust 是静态类型语言:每个值都有确定的类型,编译器在编译期完成检查。本章介绍标量类型与常见的复合类型(元组、数组、切片)。自定义的 struct / enum结构体枚举中单独讲解。

本章标题沿用「数据结构」在入门语境下对「类型与复合数据形态」的统称;严格来说 Rust 文档中多称为「数据类型(types)」。

标量类型

标量类型表示单个值,包括整数、浮点、布尔与字符。

整数类型

有符号类型以 i 开头,无符号以 u 开头,后跟位数。常用宽度如下:

类型大小有符号范围(约)
i8 / u81 字节-128~127 / 0~255
i16 / u162 字节约 ±3 万 / 0~6 万
i32 / u324 字节约 ±21 亿 / 0~2³²-1
i64 / u648 字节更大

还有与指针同宽、依平台而定的 isize / usize:索引用 usize,与 C 互操作或 FFI 时常用 isize

未写后缀的整数字面量,若上下文无法唯一推断,默认推断为 i32

rust
let a: i32 = 42;
let b: u8 = 255;
let guess = 42; // 多为 i32

可用后缀指定类型:42u820_i64。十六进制、八进制、二进制字面量同样可用,例如 0xff0o770b1010

整数除法

对整数使用 / 时结果是整数,向零截断(丢弃小数部分):

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

取值为 truefalse,常用于条件与逻辑运算(见运算符)。

rust
let is_true = true;
let is_false: bool = false;

字符类型:char

char4 字节 Unicode 标量值,用单引号:

rust
let c: char = 'a';
let emoji = '😀';

注意:字符串类型是 &strString,与单个 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..ba..=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
}

复杂场景下适当写出类型能提高可读性并减少歧义。

小结

  • 标量:i* / u* / isize / usizef32 / f64boolchar
  • 复合:元组(异构、定长)、数组(同构、定长)、切片(对连续元素的引用视图)。
  • 整数除法截断;数值转换用 as
  • 变量声明与 mut、遮蔽等见变量;表达式运算见运算符