本帖最后由 赚小钱 于 2020-7-8 14:15 编辑
结论: 枚举是类型系统中,非常非常非常非常重要的一种数据类型。
当枚举类型作为函数参数时,可以起到限制用户输入的功能。比如定义
enum Color {
RED,
GREEN,
BLUE,
}
如果一个函数要求的参数是 Color 类型,用户的输入只能是 Color::RED, Color::GREEN, Color::BLUE, 其他的输入都是非法的。
当使用枚举作为返回值时,可以保证函数的健壮性。
考虑这样两种情况,c 语言的字符串转数值函数族
#include <stdlib.h>
int atoi(const char *nptr);
这是一个设计的非常糟糕的函数,正确执行时,函数返回转换结果,执行错误时,函数返回 0 (至少我是用 archlinux 测试是返回0的)
所以,一个问题就是当返回0的时候,如何知道,确实是0,还是转换错误了。
此时,枚举类型就非常有用.
假设有这样一个枚举类型
enum Result<T, E> {
Ok(T),
Err(E),
}
使用这个枚举类型就可以将函数改写一下
Result<int, string> atoi(const char* input);
执行成功时,返回 Ok(int), 里面的值为转换结果,
执行错误时,返回Err(string), 里面的值为错误原因
这样,atoi 这个函数就不会存在二义性了。
至于与 python 的对比,我觉得就不具有对比性。
enum 是一个具体的类型,用户在使用之前,需要先声明这个类型,
而在python 中使用 tuple 时,会有人先定义一个具体的 比如 Tuple MyTupleType(int, string, string) (其实我都不知道能不能先定义一个具体的 tuple 类型的。。。)
而且,二者要解决的问题也不同。
一个 enum 变量,在任意时刻只能表示 enum 类型中的某一指定值,比如上面说的 RED GREEN BLUE 或者 Ok Err,字段之间的关系是互斥的。
tuple 的用法,个人感觉更像是返回一个匿名的,临时使用的,简单的类型。
以上都建立在我对 python 粗浅的了解的基础之上,如有问题,请指正。