【百例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
相关推荐
李日灐1 小时前
<3>Linux 基础指令:从时间、查找、文本过滤到 .zip/.tgz 压缩解压与常用热键
linux·运维·服务器·开发语言·后端·面试·指令
Bernard02151 小时前
给普通人的 AI 黑话翻译手册:一文看懂 LLM、RAG、Agent 到底是什么
前端·后端
希望永不加班1 小时前
Spring AOP 核心概念:切面、通知、切点、织入
java·数据库·后端·mysql·spring
泰式大师1 小时前
# 为什么我认为 Hermes 需要说明 self-evolution 的设计来源
后端
胖纳特1 小时前
Seafile 文件预览增强方案:集成 BaseMetas Fileview 突破格式限制
前端·后端
!停1 小时前
C++入门STL容器string底层剖析
开发语言·c++
fliter1 小时前
Rust这四个问题,从新手到专家都在被折磨
后端
军训猫猫头2 小时前
7.带输入参数的线程启动 C# + WPF 完整示例
开发语言·前端·c#·.net·wpf