枚举类型

枚举类型对于C或者其他开发人员一定也不陌生了,RUST 对于枚举类型 做了更多加强,让我们一起进入enum

最简单的枚举

RUST中的枚举类型,和C有一个非常类似的点,隐含有一个 判别值

enum Animal {
    Dog,
    Cat,
}

fn main() {
    let mut a: Animal = Animal::Dog;
    println!("{}",a as isize ); //这里使用到了类型转换 
    a = Animal::Cat;
    println!("{}",a as isize );
}

RUST 枚举 和C 类似,会默认从0给 每个枚举变体(枚举实例: Animal 是类型,Animal::Dog 是变体) 编号

也和C一样,可以修改枚举默认判别值

练习:


enum Foo {
    Bar,            // 0
    Baz = 123,      // 123
    Quux,           // 124
}

fn main() {
    let baz_discriminant = Foo::Baz as u32;
    assert_eq!(baz_discriminant, 123);
}

枚举的标识号默认大小为 isize, 可以通过 #[repr(u8)] 主动降低标识号内存

#[repr(u8)]
enum OverflowingDiscriminantError {
    Max = 255,
    MaxPlusOne // 应该是256,但枚举溢出了
}

#[repr(u8)]
enum OverflowingDiscriminantError2 {
    MaxMinusOne = 254, // 254
    Max,               // 255
    MaxPlusOne         // 应该是256,但枚举溢出了。
}

复杂类型枚举

RUST 允许枚举变体携带变量,基本形式为 变体名(T) 有以下注意点

  • 枚举变体所占内存由 枚举变体变量自身所占内存 加上 变体标识号
  • 如果使用了复杂枚举变体,则无法直接获变体标识号

enum Animal {
    Dog(i32,f64), // Dog 携带了 一个无名元组变体,
    Cat {lenth: i32, weight: f64 }, // cat 携带了一个类结构体变体
} 

fn main() {
    let mut a: Animal = Animal::Dog(10, 37.2);
    a = Animal::Cat { lenth: 20, weight: 2.7 };
}