【Rust】 2. 数据类型笔记
一、类型系统概述
Rust 是静态类型语言,所有变量类型在编译时就必须确定。
静态类型 vs 动态类型
特性 | 静态类型语言 | 动态类型语言 |
---|---|---|
类型检查时机 | 编译时期 | 运行时期 |
性能 | 更好(无运行时类型检查开销) | 较差(需要运行时类型检查) |
类型声明 | 需要显式声明 | 不需要显式声明 |
例子 | Java, C++, Rust | Python, JavaScript |
二、数据类型分类
- 标量类型(Scalar)
单个值类型
1.1 整型(Integer)
-
有符号:i8, i16, i32, i64, i128, isize
-
无符号:u8, u16, u32, u64, u128, usize
-
默认类型:i32
字面量表示:
let decimal = 98_222; // 十进制
let hex = 0xff; // 十六进制
let octal = 0o77; // 八进制
let binary = 0b1111_0000;// 二进制
let byte = b'A'; // 字节(u8)
整数溢出处理:
-
debug模式:panic
-
release模式:自动舍弃高位
-
可用方法显式处理:wrapping_, checked_, overflowing_, saturating_
1.2 浮点型(Float)
-
f32:32位单精度
-
f64:64位双精度(默认类型)
注意: 浮点数是近似值,避免直接相等性比较
1.3 布尔型(Boolean)
-
值:true/false
-
大小:1字节
-
用于逻辑运算和条件判断
1.4 字符型(Character)
-
类型:char
-
大小:4字节(Unicode标量值)
-
单字节字符:使用u8类型和b前缀
1.5 序列(Range)
1..5 // 1到4(不包含5)
1..=5 // 1到5(包含5)
- 复合类型(Compound)
组合多个值为一个类型
2.1 元组(Tuple)
-
固定长度
-
可包含不同类型
-
访问方式:模式匹配解构 或 数字索引
let tup = (500, 6.4, 1);
let (x, y, z) = tup; // 解构
let five_hundred = tup.0; // 索引访问
2.2 数组(Array)
- 固定长度
- 元素类型必须相同
- 访问方式:下标索引 或 get()方法
let a = [1, 2, 3, 4];
let first = a[0]; // 索引访问
let first = a.get(0); // 返回Option类型
2.3 结构体(Struct)
三种形式:
-
具名结构体:struct Point { x: i32, y: i32 }
-
元组结构体:struct Color(i32, i32, i32);
-
单元结构体:struct Unit;
- 枚举(Enum)
表示"或"关系,可包含不同类型数据
enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}
- 特殊类型
- Never类型:!,表示不可能返回的值(目前不稳定)
三、类型选择原则
-
理解数据特性:值范围、是否需要小数、是否可变等
-
选择最小合适类型:节省内存,提高性能
-
平衡类型安全与灵活性
-
考虑数据可变性需求
-
利用复合类型组织复杂数据
-
进行充分测试验证
四、常见错误
- 类型转换需要显式声明
let var1: i8 = 1;
let var2: i32 = var1 as i32; // 需要as关键字
- 复合数据类型不允许直接嵌套
// 错误示例
struct Node {data: i32,next: Node, // 不允许直接嵌套
}
五、总结
Rust的类型系统设计强调安全性和性能:
-
静态类型检查在编译期捕获错误
-
丰富的标量和复合类型满足各种需求
-
明确的类型转换规则防止隐式错误
-
内存安全的设计避免常见编程错误
选择合适的数据类型需要综合考虑数据的特性、内存使用、性能需求和代码可维护性等因素。