ex10: enum
enum 枚举类型
枚举类型是 Rust 中一种很神奇的类型,虽然看上去只不过是一些 struct 的组合,但是通过合理的组合和安排,一个朴素的枚举类型可以做到各种各样的事情。
枚举类型使用enum
进行声明,因为其是一个自定义的类型,所以你需要首先为这个自定义的类型起一个名字。unsafe{从某个角度上来讲,enum 是一个带有名字前缀的 struct 集合。}
枚举类型一般的声明方法如下:
枚举类型中的每一个元素都必须是一个结构体(这个结构体可以被转换成整型变量,不过我们暂时忽略这个特性),结构体的类型和 ex9 中介绍的相同,你可以把任何类型的结构体定义在枚举类型中。不过要注意的是:枚举类中定义的struct
即使名称和枚举类外面相同,你实际上也没有“使用”枚举类外面的结构体,而是重新声明了一个新的unit type
。你可以在代码中对此有一个更加清晰的理解。
枚举类型除了可以包含各种类型的结构体外,也可以像结构体一样定义自己的函数。不过你并不能枚举类型中的每一个结构体定义自己的函数,你只能为整个枚举类型定义函数。详细的内容可以查看代码。
枚举类(型)一般会和match
关键词一起使用,来根据枚举类的不同种类来进行不同的处理。match
关键词很像其他程序设计语言中的switch
关键词,都是可以根据一个变量的属性来确定分支,不过match
可以做的事情更多。我们现在只需要稍微了解match
可以做的工作即可。
枚举类的使用非常灵活多变,与之后介绍的“泛型”结合起来又可以做到更多的事情。我们现在简单地梳理一下枚举类的相关概念,在之后我们可能会还会再次深入地了解它。
代码
代码说明
#1
如果你在MyDay
外面定义了一个名为Meal
的结构体,我们希望这个结构体还能为我们提供一些其他的函数,但是你在MyDay
中直接声明Meal
是没有用的,你实际上只是重新创建了一个MyDay::Meal
的单元结构体而已。如果你真的想利用之前定义的Meal
结构体以及其功能,最简单的方法就是把你定义的结构体放到枚举类的一个 tuple struct 当中。
这个时候不妨认为枚举类实际上就是在你定义的类型(或是原有类型)外面加了一层包装而已。
#2
在 ex9 中,我们没有特别地说明成员函数,在这里我们稍微对其多说一些。
对于struct
和enum
,它们都可以绑定一些函数,这些绑定在这些类型上的函数分为两种:一类是静态函数,一类是成员函数。如果你对 OOP (面向对象的程序设计)比较熟悉的话,那么你对这两种函数应该很熟悉。
静态函数代表了一个类型不需要知道个体信息就可以调用的函数,展现形式就是在impl
块中函数定义是没有self
作为参数的函数。而成员函数就是在impl
块中具有self
参数的函数。这个self
参数是通过默认方法继续传递的,在调用的时候你不需要把它手动写在函数调用的小括号里。&self
参数类似一些编程语言的this
指针,代表一个对象本身的引用。在 Rust 中,因为所有权和可变性等等内容,这个概念会显得更加复杂,我们在这里点到为止。
#3
我们现在第一次遇到match
关键词。可以发现它的使用还是非常灵活的,不仅对于每一个enum
状态可以给出对应的执行的表达式,还可以将enum
中的结构体解构,获得其中的内容并且进行操作。
这里需要注意的是match
的书写格式,稍微记忆一下应该就没有问题,我们之后会细说match
的用法。不过可以事先了解一下,比如说每一行箭头后要求的都是表达式(也就是不能有分号),然后默认匹配使用的是_
表示(在其他语言中可能使用的是default
关键字)。
本节总结
在这一节中,我们介绍了自定义数据类型enum
。enum
具有很多丰富的使用方法,我们在之后会有更多的了解。现在我们只需要知道enum
相关最为基础的操作。
你应该对以下内容有所掌握:
enum 的声明、元素的实例化以及调用方法
enum 中三种不同的 struct 的声明写法
enum 中的 struct 可以进行解构
你应该对以下内容有所了解:
enum 可以具有自己的函数,并且可以在任何一个类型下进行调用
&self 参数所存在的函数是成员函数,&self 代表当前对象的引用
match 关键字可以和 enum 搭配针对不同的类型进行不同的操作
enum 中不能直接使用已经定义过的 struct ,需要使用 tuple struct 进行封装
参考资料
最后更新于