Rust开发之——定义枚举(16)

一 概述

  • 枚举的基本定义与使用
  • 枚举与数据关联
  • 枚举与结构体的对比
  • Option<T>枚举与空值安全

二 枚举的基本定义与使用

2.1 枚举的概念

1
2
3
4
5
6
7
8
9
10
11
12
1、概念
枚举用于定义一组可能的取值,每个取值称为成员(Variant)。

2、示例:例如,IP 地址类型可定义为:

enum IpAddrKind {
V4,
V6,
}

3、说明
枚举成员属于其类型的命名空间,通过枚举名::成员调用,如IpAddrKind::V4。

2.2 枚举实例化

1
2
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

三 枚举与数据关联

3.1 枚举成员嵌入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、枚举成员可直接关联不同类型的数据,替代结构体实现更紧凑的建模:

enum IpAddr {
V4(String), // IPv4地址关联字符串
V6(String), // IPv6地址关联字符串
}
let home = IpAddr::V4(String::from("127.0.0.1"));


2、甚至可关联不同类型的数据:

enum IpAddr {
V4(u8, u8, u8, u8), // IPv4地址关联四个u8
V6(String),
}
let home = IpAddr::V4(127, 0, 0, 1);

3.2 多类型成员示例

1
2
3
4
5
6
7
8
9
10
1、说明
枚举成员可包含不同类型或数量的数据,例如消息类型枚举:

2、示例
enum Message {
Quit, // 无数据
Move { x: i32, y: i32 }, // 包含匿名结构体
Write(String), // 包含字符串
ChangeColor(i32, i32, i32), // 包含三个整数
}

四 枚举与结构体的对比

1
2
3
4
5
1、结构体
需定义结构体包含枚举和数据,如struct IpAddr { kind: IpAddrKind, address: String }。

2、枚举
直接在成员中嵌入数据,避免额外结构体,且支持不同成员关联不同类型数据,代码更简洁。

五 Option<T>枚举与空值安全

5.1 Option<T>的定义

1
2
3
4
5
6
7
8
9
10
1、标准库中的Option<T>枚举用于表示值的存在或缺失,避免其他语言的空值(Null)问题:

enum Option<T> {
Some(T), // 存在值,包裹类型T
None, // 无值
}

2、示例
let some_num = Some(5);
let no_num: Option<i32> = None; // 需显式声明类型

5.2 空值安全机制

1
2
3
4
5
6
7
8
1、类型隔离:
Option<T>与T是不同类型,编译器禁止直接操作Option<T>如T,强制处理None情况。

2、错误示例:
i8与Option<i8>无法直接运算,避免空值引用错误。

3、设计目标:
通过类型系统确保所有可能的空值情况在编译时被处理,防止运行时崩溃。

六 参考

  • Rust中文官网——定义枚举