[Rust指南] 8.2. 向量和枚举的应用
Source: Dev.to
![Cover image for [Rust Guide] 8.2. Vector and Enum Applications](https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc4bvty1v03ggbb4v627.png)
8.2.0. 章节概览
第 8 章主要讲述 Rust 中常见的集合。Rust 提供了许多类似集合的数据结构,这些集合可以容纳多个值。然而,第 8 章涉及的集合不同于数组和元组。
第 8 章的集合存储在堆上,而不是栈上。这也意味着它们的大小不需要在编译时确定;在运行时,它们可以动态增长或收缩。
本章重点介绍三种集合:Vector、String 和 HashMap。
8.2.1. Vector 与 Enum 如何相互补充
虽然 Vector 可以动态增长或收缩,但它的所有元素仍必须是同一种数据类型。当我们需要在堆上存放不同类型的数据时,可以使用枚举(enum)。
枚举变体可以携带 附加数据,而这些附加数据可以是不同的类型。最重要的是,所有变体都属于同一个枚举类型。换句话说,所有变体的类型相同,因此它们可以存放在 Vector 中。
这使得我们可以利用枚举,使得在 Vector 中存放不同数据类型成为可能。
8.2.2. Vector + enum
下面是一个将 Vector 与枚举一起使用的实用示例:
enum SpreadSheetCell {
Int(i32),
Float(f64),
Text(String),
}
fn main() {
let row = vec![
SpreadSheetCell::Int(5567),
SpreadSheetCell::Text("up up".to_string()),
SpreadSheetCell::Float(114.514),
];
}该示例模拟了 Excel 单元格的行为。一个单元格只能存放以下三种之一:整数、浮点数或字符串。因此我们定义了 SpreadSheetCell 枚举,包含 Int、Float 和 Text 三个变体。
在 main 中,变量 row 保存了一行单元格。由于一行中的单元格数量并不固定,我们使用 Vector 来存储它们。向量初始化时包含了三个单元格:一个整数 (5567)、一个字符串 ("up up") 和一个浮点数 (114.514)。
通过使用可以携带数据的枚举,我们间接地在 Vector 中存放了不同的数据类型。
Rust 必须在编译时知道 Vector 的元素类型,以便确定需要分配多少堆内存,并确保对所有元素的批量操作都是合法的。枚举配合 match 表达式可以让 Rust 在编译时了解所有可能的情况,从而在运行时进行正确的处理。
如果可能的数据类型集合是穷尽的,枚举即可胜任。对于无限多的可能性或非穷尽集合,则需要使用 trait——这是后续章节的内容。