• 枚举
    • 参见:

    枚举

    enum 关键字允许创建一个代表数个可能变量的数据的类型(原文:The enum keyword allows
    the creation of a type which may be one of a few different variants.若您对此句有
    更好的翻译或理解,希望指出来,谢谢。)。在 struct 中任何合法的变量在 enum 同样是合法的。

    1. // 隐藏未使用代码警告的属性。
    2. #![allow(dead_code)]
    3. // 创建一个 `enum` (枚举)来划分人的类别。注意命名和类型的信息是如何一起
    4. // 明确规定变量的:
    5. // `Engineer != Scientist` 和 `Height(i32) != Weight(i32)`。每者都不相同且
    6. // 相互独立。
    7. enum Person {
    8. // 一个 `enum` 可能是个 `unit-like`(类单元结构体),
    9. Engineer,
    10. Scientist,
    11. // 或像一个元组结构体,
    12. Height(i32),
    13. Weight(i32),
    14. // 或像一个普通的结构体。
    15. Info { name: String, height: i32 }
    16. }
    17. // 此函数将一个 `Person` enum 作为参数,无返回值。
    18. fn inspect(p: Person) {
    19. // `enum` 的使用必须覆盖所有情形(无可辩驳的),所以使用 `match`
    20. // 以分支方式覆盖所有类型。
    21. match p {
    22. Person::Engineer => println!("Is engineer!"),
    23. Person::Scientist => println!("Is scientist!"),
    24. // 从 `enum` 内部解构 `i`
    25. Person::Height(i) => println!("Has a height of {}.", i),
    26. Person::Weight(i) => println!("Has a weight of {}.", i),
    27. // 将 `Info` 解构成 `name` 和 `height`。
    28. Person::Info { name, height } => {
    29. println!("{} is {} tall!", name, height);
    30. },
    31. }
    32. }
    33. fn main() {
    34. let person = Person::Height(18);
    35. let amira = Person::Weight(10);
    36. // `to_owned()` 从一个字符串 slice 创建一个具有所有权的 `String`。
    37. let dave = Person::Info { name: "Dave".to_owned(), height: 72 };
    38. let rebecca = Person::Scientist;
    39. let rohan = Person::Engineer;
    40. inspect(person);
    41. inspect(amira);
    42. inspect(dave);
    43. inspect(rebecca);
    44. inspect(rohan);
    45. }

    参见:

    attributes, match, fn, 和 String