Rust 枚举概念与类型别名

RustRustBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习 Rust 中的枚举(enum),它允许创建一种可以具有多个变体的类型,包括类似单元类型、元组结构体和类 C 结构体。我们还将了解如何定义枚举变体,并使用模式匹配来处理不同的变体。此外,我们将探索类型别名,它提供了一种通过别名引用每个枚举变体的方法,使代码更简洁易读。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 main.rs,并通过 rustc main.rs &&./main 进行编译和运行。

枚举

enum 关键字允许创建一种类型,它可以是几种不同变体之一。任何作为 struct 有效的变体在 enum 中也同样有效。

// 创建一个 `enum` 来对网页事件进行分类。注意名称和类型信息如何共同指定变体:
// `PageLoad!= PageUnload` 且 `KeyPress(char)!= Paste(String)`。
// 每个变体都是不同且独立的。
enum WebEvent {
    // 一个 `enum` 变体可以是类似单元类型的,
    PageLoad,
    PageUnload,
    // 类似元组结构体的,
    KeyPress(char),
    Paste(String),
    // 或者是类 C 结构体。
    Click { x: i64, y: i64 },
}

// 一个函数,它接受一个 `WebEvent` 枚举作为参数并且
// 不返回任何值。
fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad => println!("页面已加载"),
        WebEvent::PageUnload => println!("页面已卸载"),
        // 从 `enum` 变体内部解构出 `c`。
        WebEvent::KeyPress(c) => println!("按下了 '{}'。", c),
        WebEvent::Paste(s) => println!("粘贴了 \"{}\"。", s),
        // 将 `Click` 解构为 `x` 和 `y`。
        WebEvent::Click { x, y } => {
            println!("在 x={}, y={} 处点击。", x, y);
        },
    }
}

fn main() {
    let pressed = WebEvent::KeyPress('x');
    // `to_owned()` 从字符串切片创建一个拥有所有权的 `String`。
    let pasted  = WebEvent::Paste("我的文本".to_owned());
    let click   = WebEvent::Click { x: 20, y: 80 };
    let load    = WebEvent::PageLoad;
    let unload  = WebEvent::PageUnload;

    inspect(pressed);
    inspect(pasted);
    inspect(click);
    inspect(load);
    inspect(unload);
}

类型别名

如果你使用类型别名,你可以通过其别名来引用每个枚举变体。如果枚举的名称太长或太通用,而你想给它重命名,这可能会很有用。

enum VeryVerboseEnumOfThingsToDoWithNumbers {
    Add,
    Subtract,
}

// 创建一个类型别名
type Operations = VeryVerboseEnumOfThingsToDoWithNumbers;

fn main() {
    // 我们可以通过其别名而不是冗长且不方便的
    // 名称来引用每个变体。
    let x = Operations::Add;
}

你最常看到这种情况的地方是在使用 Self 别名的 impl 块中。

enum VeryVerboseEnumOfThingsToDoWithNumbers {
    Add,
    Subtract,
}

impl VeryVerboseEnumOfThingsToDoWithNumbers {
    fn run(&self, x: i32, y: i32) -> i32 {
        match self {
            Self::Add => x + y,
            Self::Subtract => x - y,
        }
    }
}

要了解有关枚举和类型别名的更多信息,你可以阅读此功能在 Rust 中稳定时的稳定报告。

总结

恭喜你!你已经完成了枚举实验。你可以在 LabEx 中练习更多实验来提升你的技能。