一、Rust 枚举
(一)枚举的定义
枚举允许自定义类型,取值范围只能取自预定义的命名常量的集合。
枚举就像是一个集合,其中的每个成员都是这个集合的一个特定值。
枚举适用于一个值有多种可能的情况。但必须使用模式匹配来安全地访问数据。
例如,一个Color 的类型,取值范围为Red、Orange、Yellow 等等。
在内存中,枚举值被存储为整数。可以为枚举值指定数值,否则,Rust 会从0 开始自动分配值。
默认情况下,Rust 使用能容纳所有值的最小的内建整数类型来存储枚举。大多数情况下都是一个单独的字节,
将枚举转换为整数是允许的:
然而,反过来把整数转换为枚举是不允许的。
枚举也和结构体一样可以拥有方法:
(二)枚举的赋值与取值
枚举的赋值非常直观,比如let red = Color::Red;就是将枚举值Red赋给变量red。
取值可以通过直接打印,如println!("{:?}", red);,也可以通过match语句来根据不同的枚举值执行不同的操作。
(三)带有关联数据的枚举
带有关联数据的枚举可以让我们在枚举成员中关联特定的数据类型。
比如Message枚举类型,其中Move成员与一个包含x和y坐标的结构体关联,Write成员与一个字符串关联,ChangeColor成员与三个整数关联。通过模式匹配,我们可以方便地访问这些关联数据。例如:
Rust 有三种枚举值,没有数据的对应类单元结构体。元组的对应类元组结构体。结构体的对应有花括
号和命名字段的结构体。一个枚举可以同时有这三种值:
(四)使用 Option 枚举处理空值
Option枚举是 Rust 中用于处理可能为空的值的强大工具。在除法函数中,如果除数为 0,则返回None,否则返回Some并包含除法运算的结果。例如:
(五)泛型枚举
枚举可以使用泛型,最典型的就是经常在标准库使用的Option和Result。泛型枚举的语法和泛型结构体的语法完全一致。
以下用几行代码定义了一个可以存储任意数量的T 类型值的BinaryTree 类型:
二、Rust 模式
(一)模式的定义与使用场景
模式在 Rust 中是一种特殊的语法,主要用来匹配类型中的结构,无论类型是简单还是复杂。结合使用模式和 match 表达式以及其他结构可以提供更多对程序控制流的支配权。模式在 Rust 中有广泛的应用场景,包括 let、if let、while let、for循环、函数参数和 match等场景。
如果想要访问枚举里面的数据,是不允许直接访问的,比如 let a = Some(1);是一个Option的枚举,但是不能直接使用a.0来访问里面的数据1,因为Option类型有可能是None,所以就需要使用模式匹配。
(二)模式的种类
1. 字面量、变量、通配符模式:
字面量是诸如整数、浮点数、字符、字符串、布尔值等。它们可以直接作为模式,例如:
如果需要一个匹配所有值的模式,但又不关心匹配到的值,你可以使用单个下划线_ 作为模式,也就是通配模式:
2. 结构体或元组模式:
常用于复杂数据类型,匹配数据的多个部分
3. 数组或切片模式:
数组模式匹配数组,通常用来过滤出某些特殊值:
切片模式与数组类似,但不同的是,切片的长度可以变化,切片模式中的.. 匹配任意数量的元素:
4. 引用模式:
Rust 模式支持两种和引用有关的特性。ref 模式会借用被匹配的值,& 模式匹配引用:
& 模式,一个以&开始的模式只能匹配引用:
5. 匹配守卫:
有时一个匹配分支还需要附加条件才能满足,可以在分支模式后添加条件:
6. 匹配多个模式:
使用 | 语法。例如:
7. 绑定和@模式:
x @ pattern 用给定的pattern 来匹配,匹配成功时它会创建单个变量x ,并把整个值移动或拷贝进去,而不是为匹配值的每一部分创建一个变量。