rust-Vec存储不同数据类型的几种方法

Vec简述

在 Rust 中,由于其静态类型系统的限制,Vec 默认只能存储相同类型的数据 。但如果你需要存储不同数据类型,可以通过以下方法实现

使用枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
enum Value {
Int(i32),
Float(f64),
Text(String),
}

fn main() {
let row = vec![
Value::Int(3),
Value::Text(String::from("blue")),
Value::Float(10.12),
];
}

使用特征对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
trait Draw {
fn draw(&self);
}

struct Screen {
components: Vec<Box<dyn Draw>>,
}

impl Screen {
fn run(&self) {
for component in self.components.iter() {
component.draw();
}
}
}

struct Button {
width: u32,
height: u32,
label: String,
}

impl Draw for Button {
fn draw(&self) {
println!("Button: {}, {}, {}", self.width, self.height, self.label);
}
}

struct Image {
width: u32,
height: u32,
data: Vec<u8>,
}

impl Draw for Image {
fn draw(&self) {
println!("Image: {}, {}, {}", self.width, self.height, self.data.len());
}
}

fn main() {
let screen = Screen {
components: vec![
Box::new(Button {
width: 75,
height: 10,
label: String::from("OK"),
}),
Box::new(Image {
width: 10,
height: 10,
data: vec![1, 0, 0, 1],
}),
],
};

screen.run();
}

其他方法

  • 使用 Any 类型
  • 使用第三方库,如enum-dispatch