枚举值

可以使用枚举并将数据直接放进每一个枚举成员。每个成员可以处理不同类型和数量的数据。

  1. enum IpAddr {
  2. V4(u8, u8, u8, u8),
  3. V6(String),
  4. }
  5. let home = IpAddr::V4(String::from("127.0.0.1"));
  6. let loopback = IpAddr::V6(String::from("::1"));

可以将任意类型的数据放入枚举成员中,例如字符串、数据类型或者结构体。甚至可以包含另一个枚举

  1. struct Ipv4Addr {
  2. // --snip--
  3. }
  4. struct Ipv6Addr {
  5. // --snip--
  6. }
  7. enum IpAddr {
  8. V4(Ipv4Addr),
  9. V6(Ipv6Addr),
  10. }

可以使用impl来为结构体定义方法那样,在枚举上定义方法。方法体中使用self来获取调用方法的值。

  1. enum Message {
  2. Quit,
  3. Move { x: i32, y: i32 },
  4. Write(String),
  5. ChangeColor(i32, i32, i32),
  6. }
  7. impl Message {
  8. fn call(&self) {
  9. // 在这里定义方法体
  10. }
  11. }
  12. let m = Message::Write(String::from("hello"));
  13. m.call();

Option枚举和其相对于空值的优势

Option 类型应用广泛因为它编码了一个非常普遍的场景,即一个值要么有值要么没值。意味着编译器需要检查是否处理了所有应该处理的情况。

  1. enum Option<T> {
  2. Some(T),
  3. None,
  4. }

1、可以不使用Option::前缀来直接使用Some和None。
2、当使用None而不是Some时,需要告诉 Rust Option 是什么类型的,因为编译器只通过 None 值无法推断出 Some 成员保存的值的类型。
3、空值是一个因为某种原因目前无效或者缺失的值。
4、Option 和 T(这里 T 可以是任何类型)是不同的类型,编译器不允许像一个肯定有效的值那样使用 Option。在对 Option 进行 T 的运算之前必须将其转换为 T。通常这能帮助我们捕获到空值最常见的问题之一:假设某值不为空但实际上为空的情况。这就是Option 为什么就比空值要好的原因。