Enum的基本使用
Rust使用enum
关键字定义枚举类型(Enum)。
例如,定义一个用来描述性别的枚举类型,名为Gender,它只枚举两种值:Male(表示男),Female(表示女)。
#![allow(unused)] fn main() { enum Gender { Male, // 男 Female, // 女 } }
Enum作为一种数据类型,可以用来限制允许存放的数据。比如某变量的数据类型是Gender类型,那么该变量只允许存放指定的两种值:Male或Female,不允许存放其他任何值。也就是说,枚举类型的每个实例都是从枚举类型中进行多选一的值。
#![allow(unused)] fn main() { let g1: Gender = Gender::Male; let g2: Gender = Gender::Female; // let g3: Gender = "male"; // 不允许 }
注意上面变量的类型为Gender,引用Enum内部值的方式为Gender::Male
。
Gender类型内部的Male和Female称为枚举类型的值或者枚举类型的成员,还可以称为是枚举类型的实例。反过来思考,不管是Male成员还是Female成员,它们都属于Gender类型,是Gender类型的一种值。就像12_u8是u8类型的其中一个值,属于u8类型。
例如:
enum Gender { Male, Female, } // 参数类型为Gender fn is_male(g: Gender) -> bool { // ...some code... } fn main() { // 可传递Gender已枚举的值作为参数 assert!(is_male(Gender::Male)); assert!(is_male(Gender::Female)); }
再比如,定义一个Choice枚举类型,用来枚举由用户所作出的所有可能选择。
#![allow(unused)] fn main() { enum Choice { One, Two, Three, Other, } }
Choice枚举四种可能的值,其中第四种Other
表示除前三种选择之外的所有其他选择行为,包括错误的选择(比如通过某种手段选择了不存在的选项)。
Rust中经常会看到类似于Choice的这种用法,在枚举类型中额外使用一个可以归纳剩余所有可能的成员,正如上面的Other归纳了所有其他可能的选择。
其实,前文定义的枚举类型,其每个成员都有对应的数值。默认第一个成员对应的数值为0,第二个成员的对应的数值为1,后一个成员的数值总是比其前一个数值大1。并且,可以使用=
为成员指定数值,但指定值时需注意,不同成员对应的数值不能相同。
例如:
#![allow(unused)] fn main() { enum E { A, // 对应数值0 B, // 自动加1,对应1 C = 33, // 对应33 D, // 自动加1,对应34 } }
定义之后,可使用as
将enum成员转换为对应的数值。
例如,定义英文的星期和数值相对应的枚举。
enum Week { Monday = 1, // 1 Tuesday, // 2 Wednesday, // 3 Thursday, // 4 Friday, // 5 Saturday, // 6 Sunday, // 7 } fn main(){ // mon等于1 let mon = Week::Monday as i32; }
可在enum定义枚举类型的前面使用#[repr]
来指定枚举成员的数值范围,超出范围后将编译错误。当不指定类型限制时,Rust尽量以可容纳数据大小的最小类型。例如,最大成员值为100,则用一个字节的u8类型,最大成员值为500,则用两个字节的u16。
#![allow(unused)] fn main() { // 最大数值不能超过255 #[repr(u8)] // 限定范围为`0..=255` enum E { A, B = 254, C, D, // 256,超过255,编译报错 } }