当前位置: 首页 > news >正文

rust学习笔记8-枚举与模式匹配

在 Rust 中,枚举(Enum) 是一种定义一组命名值的数据类型。它允许你创建一个可以表示多个不同值的类型,这些值被称为“变体(variants)”。枚举是 Rust 中非常强大的特性之一,广泛用于模式匹配和错误处理。

1.声明一个枚举类型

#[derive(Debug)]
enum Direction {
    Up,         //上
    Down,       //下
    Left,       //左
    Right,      //右
    UpLeft,     // 左上
    UpRight,    // 右上
    DownLeft,   // 左下
    DownRight,  // 右下
}

2. 模式匹配match 语法
枚举的目的是对某一类事物的分类,分类的目的是为了对不同的情况进行描述。基于这个原理,往往枚举类最终都会被分支结构处理(许多语言中的 switch )。 switch 语法很经典,但在 Rust 中并不支持,很多语言摒弃 switch 的原因都是因为 switch 容易存在因忘记添加 break 而产生的串接运行问题,Java 和 C# 这类语言通过安全检查杜绝这种情况出现。

Rust 通过 match 语句来实现分支结构。

#[derive(Debug)]
enum Direction {
    Up,         //上
    Down,       //下
    Left,       //左
    Right,      //右
    UpLeft,     // 左上
    UpRight,    // 右上
    DownLeft,   // 左下
    DownRight,  // 右下
}

fn main() {
    let direction = Direction::UpRight;

    match direction {
        Direction::Up => println!("向上移动"),
        Direction::Down => println!("向下移动"),
        Direction::Left => println!("向左移动"),
        Direction::Right => println!("向右移动"),
        Direction::UpLeft => println!("向左上移动"),
        Direction::UpRight => println!("向右上移动"),
        Direction::DownLeft => println!("向左下移动"),
        Direction::DownRight => println!("向右下移动"),
    }
}

运行结果

3.枚举应用主要用于Option 类型和Result 类型
Option枚举类型
Option 是 Rust 标准库中的枚举类型,用于填补 Rust 不支持 null 引用的空白。
许多语言支持 null 的存在(C/C++、Java),这样很方便,但也制造了极大的问题,null 的发明者也承认这一点,"一个方便的想法造成累计 10 亿美元的损失"。
null 经常在开发者把一切都当作不是 null 的时候给予程序致命一击:毕竟只要出现一个这样的错误,程序的运行就要彻底终止。
为了解决这个问题,很多语言默认不允许 null,但在语言层面支持 null 的出现(常在类型前面用 ? 符号修饰)。
Java 默认支持 null,但可以通过 @NotNull 注解限制出现 null,这是一种应付的办法。
Rust 在语言层面彻底不允许空值 null 的存在,但无奈null 可以高效地解决少量的问题,所以 Rust 引入了 Option 枚举类型:

enum Option<T> {
    Some(T),
    None,
}

具体用法

fn is_null<T: std::fmt::Debug>(opt: Option<T>) {
    match opt {
        Some(something) => {
            println!("{:?}", something);
        },
        None => {
            println!("opt is nothing");
        }
    }
}

fn main() {
    let opt: Option<String> = Option::None;
    is_null(opt);
    let opt2 = Option::Some("hello");
    is_null(opt2);
}

Result 枚举类型
Result 是另一个常用的枚举类型,用于表示操作的成功或失败。Ok(T) 表示成功,Err(E) 表示失败。

enum Result<T, E> {
    Ok(T),
    Err(E),
}

具体用法

fn main() {
    println!("请输入一个整数:");
    let mut input = String::new();

    std::io::stdin()
        .read_line(&mut input)
        .expect("读取输入失败");

    let n: i32 = match input.trim().parse() {
        Ok(num) => num,
        Err(_) => {
            println!("无效的输入,请输入一个整数!");
            return;
        }
    };
    if n < 0 {
        println!("n是负数");
    }else {
        println!("n不9是负数");
    }
}

总结一下,Rust的枚举类型非常灵活,能够表示多种不同的情况,每个变体可以携带不同类型和数量的数据。通过模式匹配来处理不同的情况,确保所有可能性都被覆盖。Option和Result是标准库中常用的枚举,用于处理可能缺失的值和错误情况。枚举的方法可以通过impl块定义,使得枚举具有面向对象的一些特性。此外,Rust编译器对枚举的内存布局进行优化,使得枚举在空间上尽可能高效。

相关文章:

  • 网站案例库宁波网站推广优化公司电话
  • 中学校园网网站建设规划书网站设计制作培训
  • 秦皇岛在建工程项目免费seo软件推荐
  • 河南专业网站建设公司排名百度工具
  • 苏州全网网站建设竞价排名机制
  • 四川省人民政府网优化大师使用心得
  • 使用Pycharm创建第一个Python程序
  • Maven入门教程
  • AI在投资和金融领域有什么用法和提示词
  • Redis持久化方案RDB和AOF
  • 零信任架构
  • C语言408考研先行课第一课:数据类型
  • 一个基于vue3的图片瀑布流组件
  • FFmpeg av_read_frame 和iOS系统提供的 AVAudioRecorder 实现音频录制的区别
  • redis开启过期监听
  • 《CWAP-404》,第一章:802.11 协议(1.1~1.3)
  • 搭建gn环境踩坑存档
  • 网络原理---TCP/IP
  • Windows对比MacOS
  • 头歌实验---C/C++程序设计:实验三:选择结构程序设计进阶
  • <Revit二次开发>详细介绍Autodesk.Revit.DB.HostObject类的FindInserts 方法
  • Java 大视界 —— Java 大数据在智慧能源微电网能量管理中的关键技术(100)
  • TVbox蜂蜜影视:智能电视观影新选择,简洁界面与强大功能兼具
  • 如何在 WPS 中集成 DeepSeek
  • 工程化与框架系列(11)--Serverless实践
  • ES、OAS、ERP、电子政务、企业信息化(高软35)