Rust数据类型全面解析
-
-
- [**一、标量类型(Scalar Types)**](#一、标量类型(Scalar Types))
-
- [1. **整数类型(Integer Types)**](#1. 整数类型(Integer Types))
- [2. **浮点数类型(Floating-Point Types)**](#2. 浮点数类型(Floating-Point Types))
- [3. **布尔类型(Boolean Type)**](#3. 布尔类型(Boolean Type))
- [4. **字符类型(Character Type)**](#4. 字符类型(Character Type))
- [**二、复合类型(Compound Types)**](#二、复合类型(Compound Types))
-
- [1. **元组(Tuple)**](#1. 元组(Tuple))
- [2. **数组(Array)**](#2. 数组(Array))
- [3. **结构体(Struct)**](#3. 结构体(Struct))
- [4. **枚举(Enum)**](#4. 枚举(Enum))
- [**三、指针类型(Pointer Types)**](#三、指针类型(Pointer Types))
-
- [1. **引用(Reference)**](#1. 引用(Reference))
- [2. **裸指针(Raw Pointer)**](#2. 裸指针(Raw Pointer))
- [3. **智能指针(Smart Pointers)**](#3. 智能指针(Smart Pointers))
- [**四、动态大小类型(Dynamically Sized Types, DST)**](#四、动态大小类型(Dynamically Sized Types, DST))
- [**五、Never 类型(`!`)**](#五、Never 类型(
!)) - **六、其他类型**
- **总结**
- **关联文章**
-
Rust 是一种静态类型语言,其数据类型系统强调 安全性 和 性能 ,同时通过所有权、借用和生命周期机制避免内存错误。Rust 的数据类型可分为 标量类型 (单个值)、 复合类型 (多个值组合)、 指针类型 、 动态大小类型 、 Never 类型 及其他特殊类型。以下是各类数据类型的详细说明:
一、标量类型(Scalar Types)
标量类型表示单个值,包括整数、浮点数、布尔值和字符。
1. 整数类型(Integer Types)
整数是没有小数部分的数字,Rust 提供多种位数和符号的整数类型,以满足不同场景的需求。
| 类型 | 有符号/无符号 | 位数 | 取值范围 | 典型用途 |
|---|---|---|---|---|
i8 |
有符号 | 8 位 | -128 ~ 127 | 小范围数值(如像素值) |
i16 |
有符号 | 16 位 | -32768 ~ 32767 | 中等范围数值 |
i32 |
有符号 | 32 位 | -2³¹ ~ 2³¹-1(约 ±21 亿) | 默认整数类型(如计数器) |
i64 |
有符号 | 64 位 | -2⁶³ ~ 2⁶³-1(约 ±9EB) | 大范围数值(如文件大小) |
i128 |
有符号 | 128 位 | -2¹²⁷ ~ 2¹²⁷-1 | 超大范围数值(如加密) |
isize |
有符号 | 平台相关 | 32 位系统:±2³¹;64 位系统:±2⁶³ | 索引集合(如数组下标) |
u8 |
无符号 | 8 位 | 0 ~ 255 | 字节数据(如图像像素) |
u16 |
无符号 | 16 位 | 0 ~ 65535 | 端口号、Unicode 标量值 |
u32 |
无符号 | 32 位 | 0 ~ 2³²-1(约 42 亿) | IPv4 地址、哈希值 |
u64 |
无符号 | 64 位 | 0 ~ 2⁶⁴-1(约 184EB) | 大文件大小、唯一标识符 |
u128 |
无符号 | 128 位 | 0 ~ 2¹²⁸-1 | 加密密钥、高精度计算 |
usize |
无符号 | 平台相关 | 32 位系统:0 ~ 2³²-1;64 位系统:0 ~ 2⁶⁴-1 | 内存地址、集合长度 |
特性:
- 溢出处理 :Debug 模式下整数溢出会触发
panic;Release 模式下默认"环绕"(wrapping_add等行为),可通过overflow-checks编译选项控制。 - 字面量表示 :
- 十进制:
98_222(下划线分隔可读性); - 十六进制:
0xff; - 八进制:
0o77; - 二进制:
0b1111_0000; - 字节(仅
u8):b'A'。
- 十进制:
2. 浮点数类型(Floating-Point Types)
浮点数用于表示带小数部分的数值,遵循 IEEE 754 标准。
| 类型 | 位数 | 精度 | 取值范围 | 典型用途 |
|---|---|---|---|---|
f32 |
32 位 | 单精度(6~9 位有效数字) | ±1.2×10⁻³⁸ ~ ±3.4×10³⁸ | 图形计算(如 GPU 交互) |
f64 |
64 位 | 双精度(15~17 位有效数字) | ±2.3×10⁻³⁰⁸ ~ ±1.7×10³⁰⁸ | 默认浮点类型(科学计算) |
特性:
- 特殊值 :支持
NaN(非数值,如0.0/0.0)、infinity(无穷大,如1.0/0.0)、-infinity(负无穷)。 - 比较注意 :
NaN != NaN,需用f32::is_nan()等方法判断。
3. 布尔类型(Boolean Type)
bool 类型表示逻辑值,仅占 1 字节,取值为 true 或 false。
特性:
- 用于条件判断(
if、while)、逻辑运算(&&、||、!)。 - 不能直接转换为整数(需显式处理,如
if condition { 1 } else { 0 })。
4. 字符类型(Character Type)
char 类型表示单个 Unicode 标量值(Unicode Scalar Value),占 4 字节(32 位),支持全球几乎所有语言的字符、表情符号(Emoji)和特殊符号。
特性:
- 字面量用单引号
'a'、'中'、'😊'(注意:字符串用双引号" ")。 - 范围:
U+0000~U+D7FF和U+E000~U+10FFFF(排除代理区)。 - 与整数的转换:
char可转换为u32(如'a' as u32结果为97),反之需char::from_u32()(可能失败)。
二、复合类型(Compound Types)
复合类型将多个值组合成一个类型,包括元组、数组、结构体和枚举。
1. 元组(Tuple)
元组是固定长度 的异构值集合(元素类型可不同),用圆括号 () 表示。
特性:
- 创建 :
let tup: (i32, f64, u8) = (500, 6.4, 1); - 访问元素 :
- 解构:
let (x, y, z) = tup;(x=500, y=6.4, z=1); - 索引:
tup.0(500)、tup.1(6.4)(索引从 0 开始)。
- 解构:
- 空元组 :
()称为"单元类型"(Unit Type),表示无返回值(如函数默认返回()),占 0 字节。
2. 数组(Array)
数组是固定长度 的同构值集合(元素类型相同),用方括号 [] 表示,长度在编译时确定。
声明 :let arr: [i32; 5] = [1, 2, 3, 4, 5];([类型; 长度])
初始化 :let zeros = [0; 3];(等价于 [0, 0, 0])
特性:
- 长度固定 :无法动态增删元素(需用
Vec<T>动态数组)。 - 内存连续 :元素在栈上连续存储,访问效率高(
O(1))。 - 越界检查 :访问
arr[10]会触发panic(Debug 模式)或 UB(Release 模式)。
3. 结构体(Struct)
结构体是自定义复合类型,将多个相关值组合成一个命名实体,类似其他语言的"类"(但无方法,方法需单独定义)。
类型:
-
具名字段结构体(最常见):
ruststruct User { username: String, // 字段名: 类型 email: String, sign_in_count: u64, active: bool, }创建:
let user = User { username: String::from("alice"), email: String::from("alice@example.com"), sign_in_count: 1, active: true };访问:
user.username -
元组结构体(字段无名称,类似元组):
ruststruct Color(i32, i32, i32); // 红、绿、蓝分量 let red = Color(255, 0, 0);访问:
red.0 -
单元结构体(无字段,类似空元组):
ruststruct Unit; // 用于标记类型,或实现 trait 时无数据
4. 枚举(Enum)
枚举定义一组命名的变体(Variants),每个变体可包含数据(或无数据),用于表示"多选一"的场景。
声明:
rust
enum Message {
Quit, // 无数据变体
Move { x: i32, y: i32 }, // 具名字段变体(类似结构体)
Write(String), // 元组变体(类似元组结构体)
ChangeColor(i32, i32, i32), // 元组变体
}
特性:
-
模式匹配 :通过
match或if let处理不同变体:rustfn process(msg: Message) { match msg { Message::Quit => println!("Quit"), Message::Move { x, y } => println!("Move to ({}, {})", x, y), Message::Write(s) => println!("Write: {}", s), Message::ChangeColor(r, g, b) => println!("Color: {}, {}, {}", r, g, b), } } -
常用枚举 :
Option<T>:表示"有值"(Some(T))或"无值"(None),避免空指针;Result<T, E>:表示"成功"(Ok(T))或"错误"(Err(E)),错误处理核心。
三、指针类型(Pointer Types)
Rust 的指针类型强调内存安全,分为引用 (安全)和裸指针(不安全)。
1. 引用(Reference)
引用是"借用"数据的指针,分为不可变引用(&T)和可变引用(&mut T),遵循借用规则:
- 同一时间只能有一个可变引用或多个不可变引用;
- 引用必须总是有效的(生命周期保证)。
特性:
- 自动解引用 :通过
.运算符访问数据时,Rust 自动解引用(如&x.y等价于(*x).y)。 - 生命周期 :引用需标注生命周期(多数情况可自动推导),如
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str。
2. 裸指针(Raw Pointer)
裸指针(*const T 不可变,*mut T 可变)绕过 Rust 的安全检查,直接操作内存,需使用 unsafe 块。
特性:
- 可空(
null); - 可同时拥有多个可变裸指针;
- 需手动确保内存有效性和无数据竞争。
示例:
rust
let mut num = 5;
let r1 = &num as *const i32; // 不可变裸指针
let r2 = &mut num as *mut i32; // 可变裸指针
unsafe {
println!("r1: {}", *r1); // 5
*r2 = 10;
println!("r2: {}", *r2); // 10
}
3. 智能指针(Smart Pointers)
智能指针是标准库提供的结构体 ,实现了 Deref 和 Drop trait,用于管理动态内存(如堆分配),常见类型:
Box<T>:堆分配单个值(如递归类型);Rc<T>:引用计数(单线程共享所有权);Arc<T>:原子引用计数(多线程共享所有权);RefCell<T>:内部可变性(运行时借用检查);Mutex<T>:互斥锁(多线程安全访问)。
四、动态大小类型(Dynamically Sized Types, DST)
动态大小类型的大小在编译时未知,必须通过指针间接使用(如引用、智能指针)。
| 类型 | 描述 | 示例 |
|---|---|---|
str |
字符串切片(UTF-8 编码,长度动态) | &str(如 "hello")、Box<str> |
[T] |
数组切片(元素类型 T,长度动态) |
&[i32](如 &[1, 2, 3])、Vec<T> |
dyn Trait |
Trait 对象(实现 Trait 的动态类型) |
&dyn Display、Box<dyn Animal> |
五、Never 类型(!)
! 称为"Never 类型",表示永远不会返回的值 ,用于函数返回类型时表示该函数在执行完毕前会终止(如 panic!、无限循环)。
示例:
panic!("出错了")的返回类型是!;- 无限循环
loop {}的返回类型是!; - 函数
fn exit(code: i32) -> ! { /* 终止进程 */ }。
六、其他类型
- 函数类型 :
fn(i32) -> i32表示一个接受i32并返回i32的函数。 - 闭包类型 :自动生成的匿名类型,实现
Fn、FnMut、FnOncetrait(区分捕获变量的方式)。 - 类型别名 :用
type关键字给类型起别名,如type Kilometers = i32(提高可读性)。
总结
Rust 的数据类型系统通过标量类型 (基础值)、复合类型 (组合值)、指针类型 (内存引用)、动态大小类型 (灵活长度)和Never 类型(终止标记),结合所有权机制,在保证安全的同时提供了高效的性能。理解各类类型的特性(如整数的溢出处理、数组的固定长度、引用的借用规则)是编写 Rust 代码的基础。