第11篇:选择模板与模式匹配——处理多种可能性
2026/5/3 12:46:59 网站建设 项目流程

第11篇:选择模板与模式匹配——处理多种可能性

作者:李金雨
联系方式:wbtm2718@qq.com
目标读者:Rust中文编程
核心理念:AI时代必须使用中文编程,母语编程阅读效率极高


1. 开篇引入

本课目标

  • 理解什么是选择模板(枚举)
  • 掌握枚举的定义方法
  • 理解带数据的枚举变体
  • 掌握模式匹配(match表达式)的使用
  • 掌握if let和while let的使用

生活场景引入

想象一下,你去餐厅点餐,菜单上有很多选择:

  • 汉堡
  • 披萨
  • 沙拉
  • 意大利面

每种选择都是一个选项,你可以根据自己的喜好选择其中一种。在编程中,枚举就像这样的菜单,它定义了一组可能的选项。

预期成果展示

通过这节课的学习,你将能够:

  • 定义自己的枚举
  • 创建带数据的枚举变体
  • 使用match表达式进行模式匹配
  • 使用if let和while let简化模式匹配
  • 编写能够处理多种情况的程序

2. 概念讲解

什么是选择模板(枚举)

枚举是一种自定义的数据类型,它定义了一组可能的变体。就像菜单上的选项,枚举的每个变体都是一个可能的选择。

定义枚举

在Rust中,我们使用enum关键字来定义枚举:

enum枚举名{变体1,变体2,变体3,// 更多变体...}

例如:

fnmain(){// 定义方向枚举enum方向{,,,,}// 定义天气枚举enum天气{晴天,多云,雨天,雪天,}// 定义交通信号灯枚举enum交通信号灯{红色,黄色,绿色,}}

带数据的枚举变体

枚举的变体可以携带数据,这样每个变体就可以包含不同类型的信息:

fnmain(){enum消息{文本(String),数字(i32),退出,}enum形状{圆形(f64),// 半径正方形(f64),// 边长长方形(f64,f64),// 长和宽}enum选项<T>{有值(T),无值,}}

模式匹配(match表达式)

模式匹配是一种强大的控制流结构,它可以根据枚举的变体执行不同的代码。

fnmain(){match表达式{模式1=>代码1,模式2=>代码2,// 更多模式..._=>默认代码,}}

例如:

fnmain(){enum方向{,,,,}enum消息{文本(String),数字(i32),退出,}enum形状{圆形(f64),正方形(f64),长方形(f64,f64),}fn处理方向(方向:方向){match方向{方向::=>println!("向上移动"),方向::=>println!("向下移动"),方向::=>println!("向左移动"),方向::=>println!("向右移动"),}}fn处理消息(消息:消息){match消息{消息::文本(内容)=>println!("收到文本:{}",内容),消息::数字(数字)=>println!("收到数字:{}",数字),消息::退出=>println!("退出程序"),}}fn计算面积(形状:形状)->f64{match形状{形状::圆形(半径)=>std::f64::consts::PI*半径*半径,形状::正方形(边长)=>边长*边长,形状::长方形(,)=>*,}}}

if let和while let

if let和while let是简化的模式匹配,用于处理只有一种情况需要处理的场景。

if let
fnmain(){enum选项<T>{有值(T),无值,}let可能的值=选项::有值(42);iflet选项::有值()=可能的值{println!("有值:{}",);}else{println!("无值");}}
while let
fnmain(){enum消息{文本(String),数字(i32),退出,}letmut消息列表=vec![消息::文本(String::from("你好")),消息::数字(42),消息::退出,];whileletSome(消息)=消息列表.pop(){match消息{消息::文本(内容)=>println!("处理文本:{}",内容),消息::数字(数字)=>println!("处理数字:{}",数字),消息::退出=>println!("处理退出"),}}}

3. 动手实践

基础练习(必做)

  1. 创建"形状"枚举,计算面积

    enum形状{圆形(f64),正方形(f64),三角形(f64,f64,f64),}fn计算面积(形状:形状)->f64{match形状{形状::圆形(半径)=>std::f64::consts::PI*半径*半径,形状::正方形(边长)=>边长*边长,形状::三角形(a,b,c)=>{// 使用海伦公式计算三角形面积lets=(a+b+c)/2.0;(s*(s-a)*(s-b)*(s-c)).sqrt()}}}fnmain(){let圆形=形状::圆形(5.0);let正方形=形状::正方形(4.0);let三角形=形状::三角形(3.0,4.0,5.0);println!("圆形面积:{}",计算面积(圆形));println!("正方形面积:{}",计算面积(正方形));println!("三角形面积:{}",计算面积(三角形));}
  2. 创建"命令"枚举,处理不同的用户命令

    enum命令{退出,帮助,问候(String),计算(i32,i32),}fn处理命令(命令:命令){match命令{命令::退出=>println!("退出程序"),命令::帮助=>println!("可用命令:退出、帮助、问候 <名字>、计算 <数字1> <数字2>"),命令::问候(名字)=>println!("你好,{}!",名字),命令::计算(a,b)=>println!("{} + {} = {}",a,b,a+b),}}fnmain(){处理命令(命令::帮助);处理命令(命令::问候(String::from("张三")));处理命令(命令::计算(10,20));处理命令(命令::退出);}
  3. 创建"选项"枚举,处理可能有值或无值的情况

    enum选项<T>{有值(T),无值,}fnmain(){let有值=选项::有值(42);let无值:选项<i32>=选项::无值;// 使用match处理match有值{选项::有值()=>println!("有值:{}",),选项::无值=>println!("无值"),}// 使用if let处理iflet选项::有值()=有值{println!("if let有值:{}",);}iflet选项::无值=无值{println!("if let无值");}}

进阶练习(选做)

  1. 创建"天气"枚举,根据天气给出建议

    enum天气{晴天,多云,雨天,雪天,}fn天气建议(天气:天气){match天气{天气::晴天=>println!("天气晴朗,适合户外活动!"),天气::多云=>println!("天气多云,建议带件外套。"),天气::雨天=>println!("下雨了,记得带伞!"),天气::雪天=>println!("下雪了,注意保暖和安全!"),}}fnmain(){天气建议(天气::晴天);天气建议(天气::雨天);天气建议(天气::雪天);}
  2. 创建"交通信号灯"枚举,模拟交通信号灯

    enum交通信号灯{红色,黄色,绿色,}fn信号灯状态(信号灯:交通信号灯){match信号灯{交通信号灯::红色=>println!("停止!"),交通信号灯::黄色=>println!("准备!"),交通信号灯::绿色=>println!("通行!"),}}fnmain(){信号灯状态(交通信号灯::红色);信号灯状态(交通信号灯::黄色);信号灯状态(交通信号灯::绿色);}

挑战练习(拓展)

  1. 创建"表达式"枚举,计算表达式的值
    enum表达式{数字(i32),加法(Box<表达式>,Box<表达式>),减法(Box<表达式>,Box<表达式>),乘法(Box<表达式>,Box<表达式>),除法(Box<表达式>,Box<表达式>),}fn计算(表达式:表达式)->i32{match表达式{表达式::数字()=>,表达式::加法(a,b)=>计算(*a)+计算(*b),表达式::减法(a,b)=>计算(*a)-计算(*b),表达式::乘法(a,b)=>计算(*a)*计算(*b),表达式::除法(a,b)=>计算(*a)/计算(*b),}}fnmain(){// 计算 (2 + 3) * 4let表达式=表达式::乘法(Box::new(表达式::加法(Box::new(表达式::数字(2)),Box::new(表达式::数字(3)),)),Box::new(表达式::数字(4)),);let结果=计算(表达式);println!("结果:{}",结果);}

4. 知识总结

核心概念回顾

  • 枚举:一种自定义数据类型,定义了一组可能的变体
  • 枚举变体:枚举中的每个选项
  • 带数据的变体:可以携带数据的枚举变体
  • 模式匹配:使用match表达式根据枚举变体执行不同的代码
  • if let:简化的模式匹配,用于处理只有一种情况的场景
  • while let:在循环中使用的简化模式匹配

关键代码速查

功能代码说明
枚举定义enum 枚举名 { 变体1, 变体2, ... }定义一个枚举
带数据的枚举enum 枚举名 { 变体1(类型), 变体2(类型), ... }定义带数据的枚举
模式匹配match 表达式 { 模式1 => 代码1, 模式2 => 代码2, _ => 默认代码 }使用match表达式进行模式匹配
if letif let 模式 = 表达式 { 代码 } else { 代码 }简化的模式匹配
while letwhile let 模式 = 表达式 { 代码 }循环中的简化模式匹配

常见错误提醒

  1. 未覆盖所有情况:match表达式必须覆盖枚举的所有变体,或者使用通配符_
  2. 模式不匹配:模式与表达式的类型不匹配
  3. 数据提取错误:从带数据的变体中提取数据时出错
  4. 递归枚举:递归枚举需要使用Box来避免无限大小

5. 课后作业

巩固练习题

  1. 编写一个程序,定义"动物"枚举,包含不同种类的动物及其特征
  2. 编写一个程序,定义"颜色"枚举,包含RGB颜色值
  3. 编写一个程序,使用if let和while let处理选项类型

创意编程题

  1. 发挥你的创意,创建一个程序,定义"游戏状态"枚举,处理游戏的不同状态
  2. 编写一个程序,定义"文件操作"枚举,处理文件的不同操作(读取、写入、删除等)

下篇预习提示

下一篇我们将学习"模块与错误处理——组织代码与处理问题",这是Rust中组织代码和处理错误的重要工具。预习一下:

  • 什么是模块?
  • 如何创建模块?
  • 什么是错误处理?
  • 如何使用Result类型?

恭喜你完成了第十一篇教程!你已经掌握了枚举和模式匹配,学会了如何处理多种可能性。继续加油,下一篇我们将学习如何组织代码和处理错误!

学习交流

如果你在学习过程中遇到任何问题,欢迎联系我:

  • ** 视频号,“时空系”
  • 邮箱:wbtm2718@qq.com
  • 其他提示:
  • 本人正在开发纯中文编程语言和编译器,有兴趣的可以交流
  • 本人正在写一本基于中国母语思维习惯的数学教材,可以让你一年内学完从初中到研究生的数学,而且可以让你快速掌握人工智能的关键数学知识,有兴趣的可以交流

祝你学习愉快!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询