【百例RUST - 008】枚举

【百例RUST - 008】枚举

第一章 基础用法

第01节 类似C语言的定义方式

定义格式

复制代码
enum 枚举名称{
    枚举值1,
    枚举值2,
}

案例代码

rust 复制代码
fn main(){
    // 类似于 C语言的定义方式
    #[derive(Debug)]    // 这里的宏, 只是为了方便输出看结果
    enum IpAddKind{
        V4,
        V6,
    }
    
    #[derive(Debug)]   // 这里的宏, 只是为了方便输出看结果
    struct IpAddr{
        kind: IpAddKind,
        address: String,
    }
    
    let i1 = IpAddr{
        kind: IpAddKind::V4,
        address: String::from("127.0.0.1"),
    };
    let i2 = IpAddr{
        kind: IpAddKind::V6,
        address: String::from("fe80::202:b3ff:fe1e:8329"),
    };
    
    println!("i1 = {:#?}", i1);
    println!("i2 = {:#?}", i2);
}

//  i1 = IpAddr {
//      kind: V4,
//      address: "127.0.0.1",
//  }
//  i2 = IpAddr {
//      kind: V6,
//      address: "fe80::202:b3ff:fe1e:8329",
//  }

第02节 rust推荐的定义方式

相同的类型方案

rust 复制代码
fn main(){
    // rust 推荐的定义方式
    #[derive(Debug)]
    enum IpAddKind{
        V4(String),
        V6(String),
    }
    
    let i1 = IpAddKind::V4(String::from("127.0.0.1"));
    let i2 = IpAddKind::V6(String::from("fe80::202:b3ff:fe1e:8329"));
    
    println!("i1 = {:#?}", i1);
    println!("i2 = {:#?}", i2);
}

//  i1 = V4(
//      "127.0.0.1",
//  )
//  i2 = V6(
//      "fe80::202:b3ff:fe1e:8329",
//  )

不同的类型方案

rust 复制代码
fn main(){
    // rust 推荐的定义方式
    #[derive(Debug)]
    enum IpAddKind{
        V4(u8,u8,u8,u8),
        V6(String),
    }
    
    let i1 = IpAddKind::V4(127,0,0,1);
    let i2 = IpAddKind::V6(String::from("fe80::202:b3ff:fe1e:8329"));
    
    println!("i1 = {:#?}", i1);
    println!("i2 = {:#?}", i2);
}

//  i1 = V4(
//      127,
//      0,
//      0,
//      1,
//  )
//  i2 = V6(
//      "fe80::202:b3ff:fe1e:8329",
//  )

第二章 经典用法

第01节 rust的经典用法

案例代码

rust 复制代码
// rust 经典用法
#[derive(Debug)]
enum Message {
    Quit,
    Move{x:i32, y:i32},
    Write(String),
    Change(i32, i32, i32),
}

fn main() {
    let i1 = Message::Quit;
    let i2 = Message::Move{x:10, y:20};
    let i3 = Message::Write(String::from("hello"));
    let i4 = Message::Change(11, 22, 33);

    println!("i1 = {:#?}", i1);
    println!("i2 = {:#?}", i2);
    println!("i3 = {:#?}", i3);
    println!("i4 = {:#?}", i4);
}


//  i1 = Quit
//  i2 = Move {
//      x: 10,
//      y: 20,
//  }
//  i3 = Write(
//      "hello",
//  )
//  i4 = Change(
//      11,
//      22,
//      33,
//  )

第02节 枚举中的方法

案例代码

rust 复制代码
// rust 经典用法
#[derive(Debug)]
enum Message {
    Quit,
    Move{x:i32, y:i32},
    Write(String),
    Change(i32, i32, i32),
}

// 定义枚举类型的方法(准备分支选择)
impl Message{
    fn print_message(&self){
        match self{
            Message::Quit => println!("Quit"),
            Message::Move{x, y} => println!("Move x={}, y={}", x, y),
            Message::Write(text) =>println!("Write {}", text),
            Message::Change(a, b, c) => println!("Change a={}, b={}, c={}", a, b, c),
        }
    }
}


fn main() {
    let i1 = Message::Quit;
    let i2 = Message::Move{x:10, y:20};
    let i3 = Message::Write(String::from("hello"));
    let i4 = Message::Change(11, 22, 33);
    
    i1.print_message();
    i2.print_message();
    i3.print_message();
    i4.print_message();
}

//  Quit
//  Move x=10, y=20
//  Write hello
//  Change a=11, b=22, c=33
相关推荐
未秃头的程序猿6 小时前
JDK 26的Value Class,我做了个性能测试,结果出乎意料
java·后端·面试
swipe6 小时前
10|(前端转全栈)库存扣减为什么最容易出事故?SKU、并发与原子更新
前端·后端·全栈
smallYoung6 小时前
学习笔记-python基础(day12 正则表达式)
后端
Zane19946 小时前
volatile / synchronized / final:三大特性(原子性/可见性/有序性)到底谁保证了什么?
java·后端
网易云信6 小时前
销售为什么是企业 AI 落地的"最佳突破口"?
人工智能·后端·agent
米尔的可达鸭6 小时前
UDP 通信深度实验:从 Windows FastPath 到 ICMP 端口不可达的完整排查
windows·websocket·网络协议·rust·udp·wireshark·tcpdump
Alan_756 小时前
文件下载中文文件名乱码终极方案
后端
枫叶V6 小时前
请求可以重试,业务只能生效一次:我们的幂等架构实践
后端
忘路之远近i6 小时前
受够阿里云自带终端后,我用 Cursor + grill-me 做了个运维面板
服务器·开发语言·人工智能·python·阿里云·云计算
Ai拆代码的曹操6 小时前
K8s 调度器 predicate 阶段揭秘:为什么你的 Pod 总是堆在同一台机器
后端·容器