首页 技术杂谈 正文
  • 本文约1284字,阅读需6分钟
  • 180
  • 0

Rust - 枚举

摘要

Rust枚举,类型安全的变体集合。它不仅提供传统的枚举功能,还允许嵌套值,实现模式匹配,是Rust强大类型系统中的多面手。

1、枚举

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

1.1、定义枚举

// 定义枚举类型
enum IpAddrKind {
    v4,
    v6
}
fn main() {
    // 定义枚举的值
    let fout = IpAddrKind::v4;
    let six = IpAddrKind::v6;

    route(fout);
    route(six);
    route(IpAddrKind::v4)
}

fn route(ip_kind:IpAddrKind){}

1.2、把数据附加到枚举类型中

// 定义枚举类型
enum IpAddrKind {
    v4,
    v6
}

struct IpAddr{
    Kind :IpAddrKind,
    address : String,
}
fn main() {
    let home = IpAddr{
        Kind : IpAddrKind::v4,
        address : String::from("127.0.0.1"),
    };

    let loopback = IpAddr{
        Kind : IpAddrKind::v6,
        address : String::from("::1"),
    };
}

1.3、把数据附加到枚举变体中

  • 就不用特意把类型存储在struct中
  • 可以在枚举类型中嵌入不同类型的变体
// 定义枚举类型
enum IpAddrKind {
    v4(u8,u8,u8,u8),
    v6(String),
}

fn main() {
    let home = IpAddrKind::v4(127, 0, 0, 1);
    let loopback = IpAddrKind::v6(String::from("::1"));
}

1.4、为枚举定义方法

  • 也是使用Impl定义
// 定义枚举类型
enum IpAddrKind {
    v4(u8,u8,u8,u8),
    v6(String),
}

impl IpAddrKind {
    fn call(&self){}
}

fn main() {
    let home = IpAddrKind::v4(127, 0, 0, 1);
    let loopback = IpAddrKind::v6(String::from("::1"));

    home.call();
    loopback.call();
}

1.5、Option枚举

  • 定义在标准库中
  • 在Parelude(预导入模块)中
  • 描述了:某个值可能存在(某种类型)或不存在的情况
  • Rust没有NULL这个类型,使用了Option来使用
fn main() {
   let some_number = Some(5);
   let some_String = Some("A String");

   let absent_number : Option<i32> = None;
}

1.6、match控制流运算符

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对于的代码
  • 模式可以是字面量、变量名、通配符
  • 枚举类型必须把所有穷举的可能都要写上
    • 如果只想写几种结果,其他让系统自动匹配,则使用 _ 下划线
enum Coin {
    Penny,
    Nickkel,
    Dime,
    Quarter,
}

fn value_in_cents(coin:Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Dime => 5,
        Coin::Nickkel => 10,
        Coin::Quarter => 20,
    }
}
评论