11_rust_枚举

枚举

枚举允许列举所有可能的值来定义一个类型。

定义枚举

enum Color {
    RED,
    BLUE,
}

fn main() {
    let red = Color::RED; // 定义一个枚举值
    test_enum(red);
    test_enum(Color::BLUE);
}
fn test_enum(e: Color) {}

将数据附加到枚举的变体中

enum IpAddr {
    V4(String),
    V6(String),
}

像这样,可对枚举的每个值附加数据类型,这样就不用像其他语言一样用额外的struct类包装枚举类型了。
优点:

  • 不需要额外使用struct
  • 每个变体可拥有不同的类型以及关联的数据量
enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

fn main() {
    let v4 = IpAddr::V4(192.168.1.1);
    let v6 = IpAddr::V4(String::from("::1"));
}

再比如rust标准库中的IpAddr的定义:

struct Ipv4Addr {}
struct Ipv6Addr {}
enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}

也可以是多种数据类型

enum Msg {
    Quit, // 没有关联任何数据类型
    Move {x: i32, y: i32},
    Write(String),
    Change(i32, i32, i32),
}

枚举定义方法

和struct一样,也是在impl代码块中定义枚举,第一个参数也是self。

enum Msg {
    Quit, // 没有关联任何数据类型
    Move {x: i32, y: i32},
    Write(String),
    Change(i32, i32, i32),
}
impl Msg {
    fn test(&self) {}
}

Option枚举

  • 定义于标准库中,在Prelude(预导入模块)中,描述了某个值可能存在(某种类型)或不存在的情况。

rust语言没有null。在其他语言使用null表示没有值(null本身是个值),有null的语言中一个变量可处于空(null)、非空两种状态。但null的问题在于,当你尝试像使用非null值一样使用null值时,程序就容易引起某种错误,比如null无法操作字符串等报错。null的概念主要作用是用于表示因某种原因而变为无效或缺失的值。
所以rust提供了类似于Null概念的枚举:

Option<T>
// 标准库中的定义:
enum Option<T> { //T是枚举
  Some(T),
  None
}

它包含在Prelude(预导入模块)中,可直接使用:

Option<T>
Some(T)
None

例子

fn main() {
    let some_num = Some(5); // 编译器推断出i32类型
    let some_str = Some("a str"); // 推断出&str类型
    let none_ty: Option<i32> = None; // 因是None,无法推断出是什么类型,故需要手动指明
}

Option<T>比Null更好的地方:
Option<T>和T是不同类型,不能把Option<T>直接当成T使用。

fn main() {
    let x: Option<i8> = Some(5);
    let y: i8 = 3;
    let sum = x + y; // 编译报错:cannot add Option<i8> to i8
}

若要使用Option<T>中的T,必须将它转换为T。这样可避免其他语言中的假设某个值存在,但却为Null时的运行时错误。
比如其他语言可能有
string a = null; string b = a + "123";

posted @ 2023-10-19 00:57  00lab  阅读(7)  评论(0编辑  收藏  举报