Rust之枚举和模式匹配(三):简明控制流if let

Rust模式匹配 模式匹配是从函数式编程语言(例如:Haskell,Lisp)吸收而来的,用于为复杂的类型系统提供一个轻松的解构能力。rust使用match来提供模式匹配的功能。mathc类似于其它编程语言中的switch-case,但是远比switch-case强大。match的通用模式如下所示。该形式清晰的说明了何为模式,何为模式匹配:将模式与 target 进行匹配,即为模式匹配,而模式匹配不仅仅局限于 match,还有if let。 阅读详情

开发环境

  • Windows 10
  • Rust 1.60.0

 

  •  VS Code 1.66.2 

 项目工程

这里继续沿用上次工程rust-demo

简明控制流 - if let

if let语法允许您将if和let组合成一种不太冗长的方式来处理匹配一个模式的值,而忽略其余的模式。考虑下面示例中,它匹配config_max变量中的一个Option<u8 >值,但是如果这个值是Some变量,它只想执行代码。

  let config_max = Some(3u8);       // Some
    match config_max {
        Some(max) => println!("The maximum is configured to be {}", max),
        _ => (),
    }

如果值是Some,我们通过将值绑定到模式中的变量max来打印出Some变量中的值。我们不想对None值做任何事情。为了满足match表达式,我们必须在只处理一个变量后添加_ = >()这是添加样板代码。

相反,我们可以用if let以更短的方式来写。以下代码与上例的匹配行为相同:

  let config_max = Some(3u8);
    if let Some(max) = config_max {    // if let
        println!("The maximum is configured to be {}", max);
    }

语法if let采用等号分隔的模式和表达式。它的工作方式与match相同,表达式被赋予match,模式是它的第一个分支。在这种情况下,模式是Some(max),max绑定到Some内部的值。然后,我们可以在if let块的主体中使用max,就像在相应的match分支中使用max一样。如果值与模式不匹配,if let块中的代码不会运行。

使用if let意味着更少的输入、更少的缩进和更少的样板代码。但是,您会失去match强制执行的详尽检查。在match和if let之间进行选择取决于您在特定情况下正在做什么,以及获得简明性是否是失去彻底检查的适当折衷。

换句话说,您可以将if let视为match的语法糖,当值匹配一个模式时运行代码,然后忽略所有其他值。

我们可以在if let中包含else。与else一起使用的代码块与与if let和else等价的匹配表达式中的_ 分支一起使用的代码块是相同的。回想一下之前示例中的Coin枚举定义,其中Quarter变量也包含一个UsState值。如果我们想计算我们看到的所有non-quarter硬币,同时宣布quarters硬币的状态,我们可以使用如下match表达式:

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn main() {
    let coin = Coin::Penny;
    let mut count = 0;
    match coin {                   // match表达式
        Coin::Quarter(state) => println!("State quarter from {:?}!", state),
        _ => count += 1,
    }
}

或者我们可以使用if let和else表达式,如下所示:

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn main() {
    let coin = Coin::Penny;
    let mut count = 0;
    if let Coin::Quarter(state) = coin {               // if let表达式
        println!("State quarter from {:?}!", state);
    } else {
        count += 1;
    }
}

编译

cargo run

 

如果你的程序逻辑过于冗长,无法用匹配来表达,请记住,if let也在你的Rust工具箱中。

总结 

我们现在已经介绍了如何使用枚举来创建可以作为一组枚举值之一的自定义类型。我们已经展示了标准库的Option<T> 类型如何帮助您使用类型系统来防止错误。当枚举值中包含数据时,可以使用match或if let来提取和使用这些值,这取决于需要处理多少个事例。

Rust程序现在可以使用结构和枚举来表达领域中的概念。创建在API中使用的自定义类型可以确保类型安全:编译器将确保您的函数只获取每个函数所期望的类型的值。

本章重点

  • match使用
  • if let使用
  • if let使用场景
Rust的if let语法:更简洁的模式匹配 阅读详情

相关推荐

【Rust】Rust中的枚举与模式匹配,原理解析与应用实战

枚举(enumerations),也被称作 enums。枚举允许你通过列举可能的值来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option ,它代表一个值要么是某个值,要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。

景天科技苑 7万+

Rust简洁控制流 if let

在这个表达式中,pattern是要匹配的模式,expression是要匹配的值,当expression与pattern匹配,则执行if代码块,否则,执行else代码块。代码中,模式是Some(max),max绑定Some中的值。接着在if-let代码块中使用max,如果模式不匹配,if-let中的代码不会执行。相对match控制流,if let 控制流相对比较简洁,用来处理只匹配一个模式而忽略其他模式。使用if-let意味着编写更少的代码,更少的样板代码,当失去了match强制要求的穷尽性检查。

qq5551230的博客 1225

猿创征文 | 【Rust指南】枚举类与模式匹配精讲

书接上文,本篇博客分享的是Rust枚举类与模式匹配的知识。作为安全性强的语言,Rust 的枚举类并不像其他编程语言中的概念那样简单,但依然可以十分简单的使用。

叶落秋白的博客 2133

【Rust自学】6.4. 简单的控制流-if let

`if let`语法允许将`if`和`let`组合成一种不太冗长的方式来处理**与一种模式匹配的值,同时忽略其余模式**。

A Rookie in San Domenico School 1154

landsat8数据下载教程

下载landsat数据教程

weixin_44001203的博客 1万+

告别手动翻页!用幻影联动+DLL调用,5分钟搞定通达信分时指标自动选股

本文详细介绍了如何利用幻影联动软件结合DLL调用技术,实现通达信分时指标的自动化选股。通过改造指标代码和配置幻影联动任务,用户可以在5分钟内完成从信号检测到自动报警的全流程,大幅提升短周期交易的效率和准确性。

weixin_42561040的博客 764

Rust语言教程(9) - if let表达式与枚举进阶

Rust通过if let语句来实现对于枚举匹配的简写,这也是现代语言的常见特性

lusing的专栏 1392

CODESYS EtherCAT通讯断了怎么办?手把手教你用ST语言写状态监测程序(附完整代码)

本文详细解析了CODESYS平台下EtherCAT通讯中断的故障排查与恢复方法,通过ST语言编写状态监测程序实现链路监测、故障隔离和伺服恢复。文章包含完整代码示例,帮助工程师快速诊断EtherCAT网络问题,提升工业自动化设备的运行稳定性。

weixin_30919571的博客 209

第7章 枚举与模式匹配

Rust枚举与模式匹配 本章深入探讨Rust中枚举(enum)和模式匹配的核心特性,主要内容包括: 枚举定义与使用: Rust枚举比传统枚举更强大,能关联不同类型和数量的数据 枚举变体可以表示简单标签或复杂数据结构 可以为枚举定义关联函数和方法 Option枚举: Rust使用Option<T>处理可能缺失的值 避免空指针异常,强制显式处理None情况 模式匹配: match表达式提供强大的模式匹配能力 编译器确保所有可能情况都被处理 支持解构枚举、绑定值等高级用法 if let语法: 简化只关

百锦再的博客 849

Python地理空间数据库之geopandas使用详解

地理空间数据分析在许多领域中都有着广泛的应用,包括地理信息系统(GIS)、城市规划、环境科学、地质勘探等。Python GeoPandas是一个强大的库,旨在简化地理空间数据的处理和分析。本文将深入介绍GeoPandas库,包括其基本概念、功能特性、示例代码以及在实际应用中的应用场景。

Rocky006的博客 1万+

ArcGIS小白必看:5分钟搞定shp矢量文件分割(附常见错误排查)

本文为ArcGIS新手详细解析了分割shp矢量文件的四种核心方法:裁剪工具、分割工具、按属性选择导出及ArcPy脚本自动化。重点强调了投影匹配等关键步骤,并提供了常见错误排查指南,帮助用户快速掌握矢量数据分割技巧,提升GIS数据处理效率。

h9j8k7l6m5n的博客 798

【Rust】枚举和模式匹配

结构体给予你将字段和数据聚合在一起的方法,像Rectangle结构体有width和height两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4 和 IPv6。这是程序可能会遇到的所有可能的 IP 地址类型:所以可以枚举出所有可能的值,这也正是此枚举名字的由来。任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。

m0_72516377的博客 1214

高功率半导体叠阵激光准直

摘要:研究针对高功率半导体激光器叠阵的光束整形问题,通过Zemax软件模拟5个巴条(间隔1.81mm)的LD阵列(总功率300W)。采用非序列模式建立模型,设置慢轴/快轴发散角分别为5°和19.5°,并配置包含19个发光点的巴条结构。通过S-TIH53材质的快轴准直镜(焦距0.6mm)和慢轴准直镜(焦距2.88mm)进行光束整形,有效降低了快慢轴发散角。仿真结果表明该方法能显著改善叠阵激光的光束质量,为高亮度光纤耦合提供了解决方案。

Zhaxibamao的博客 915

【Rust】枚举与模式匹配

枚举是一种数据类型,允许将一个值限制为一组可能的值。例如,可以定义一个表示形状的枚举,包含矩形(Rectangle)、圆形(Circle)和三角形(Triangle)。

qq_61867911的博客 1332

最新Python爬虫实战(入门爬虫篇)——案例1:某瓣网站Top250图片数据采集(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了某瓣Top250电影封面的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖请求、解析、存储的完整流程。学习重点包括:抓包工具定位数据源、正则表达式匹配图片链接、模拟请求头绕过反爬机制、以及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践。

努力让自己发光,对的人才能迎着光而来 16万+

高级用法:LangChain 安全防护(Guardrails)

在调用开始时校验请求,可做关键词过滤、身份校验、限流等。= "human":return {}],# 使用],= "human":return {}],

Long_像风一样自由 316

【Rust】枚举和模式匹配——Rust语言基础14

的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。语法是一个泛型参数,虽然目前还没学习到,但相信大家也不陌生,泛型在其它编程语言中也是很常见和重要的存在。的概念,由于考虑到所有变量都存在一种空值和非空值的状态会为编程语言带了巨大问题甚至是会引起各种漏洞,因此。匹配是穷举匹配,必须要为所有可能的结果编写对应的匹配处理过程,否则编译器将会阻止这种情况。这样以来,条件控制语句我们也掌握的差不多了,看完了,也懂了,让我们试着用一下吧。,如果其中含有一个值,将其加一。

Imagine Miracle的博客 1129

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Rust模式匹配实战:match与if let详解

Rust模式匹配实战:match与if let详解 【免费下载链接】rust-by-practice Learning Rust By Practice, narrowing the gap between beginner and skilled-dev through challenging examples, e...

gitblog_00452的博客 484

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

06-枚举和模式匹配

结构体提供了一种将相关字段和数据组合在一起的方法,如 Rectangle 及其 width 和 height ,而枚举则提供了一种表示某个值是一组可能值之一的方法。例如,我们可能想说 Rectangle 是一组可能的形状之一,其中还包括 Circle 和 Triangle。为此,Rust 允许我们将这些可能性编码为一个枚举。让我们来看看我们可能想在代码中表达的一种情况,看看为什么在这种情况下枚举是有用的,而且比结构体更合适。假设我们需要处理 IP 地址。

优快云爱好者的独到见解 1198

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Rust-08-枚举和模式匹配

结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 width 和 height 两个字段。而枚举给予你将一个值成为一个集合之一的方法。比如,我们想让 Rectangle 是一些形状的集合,包含 Circle 和 Triangle。为了做到这个,Rust 提供了枚举类型。

weixin_43714208的博客 1393

Rust 学习笔记:枚举与模式匹配

Rust 学习笔记:枚举与模式匹配

ProgramNovice的博客 1008

Rust if let 与 while let 语法糖:模式匹配的优雅简化

本文深入剖析了 Rust 中 if let 和 while let 语法糖的设计原理和应用场景。这两种语法简化了常见的模式匹配操作:if let 专注于处理单一枚举变体,避免了完整 match 的冗余;while let 则将模式匹配与循环结合,特别适合处理迭代器和状态机。通过多个代码示例展示了它们在实际开发中的应用,包括处理 Option/Result、解构复杂枚举、引用模式、链式调用等场景。文章指出这些语法糖体现了 Rust 在表达力与简洁性之间的平衡,通过消除样板代码提高了代码的可读性和可维护性。

超哥的博客 707

Rust if let 与 while let 语法糖:条件匹配的简洁优雅

更深层的意义在于,它们鼓励开发者用更自然的方式编写代码,降低了模式匹配的心理负担,使得 Option 和 Result 这样的核心类型在实际应用中更加易用。这种"写出符合思维的代码"的能力,是 Rust 设计中最令人欣赏的地方,也是为什么 Rust 代码往往比其他系统编程语言更易读的原因。的代码更清晰,意图一目了然。最常见的用途是处理 Option 和 Result,但其真正的威力在于所有权的精确控制。完整的 match 表达式提供了最大的灵活性,但对于 90% 的实际使用场景,这种灵活性是过度的。

kelvislawyer的博客 1627

看懂数据的那一刻:Rust 模式匹配的实战心法(match / if let / 解构)

把“值长什么样”写进代码本身,是 Rust 模式匹配带来的最大红利。本文围绕 `match`、`if let`、`while let` 与解构写法,给出可直接落地的套路:如何在枚举/结构体/元组/切片上做层层解构,何时用守卫与 `@` 绑定把条件收拢到一处,`or`-patterns 与切片模式在协议/日志解析中的价值,以及 `let-else` 在早退与错误处理里的清爽用法。配套的反例与重构建议,帮助你把“复杂条件判断”改写成“可读、可验证”的模式分支。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 863

第N次入门Rust - 5.枚举和模式匹配

这一篇主要介绍基本的枚举和模式匹配,这两个语法点在Rust中被大量应用~

你好! 909

解锁 Rust 的人体工程学:if let 与 while let 的专业解读与实践

if let和while let绝不仅仅是为了少打几个字。if let是 Rust 在“绝对安全”(match穷尽性)和“日常便利”之间找到的最佳平衡点。**`while let 是 Rust处理状态驱动循环和消费者的惯用(Idiomatic)方式,它将“循环条件”和“安全解包”无缝结合。if let链更是将这种便利性推向了极致,让复杂的条件判断变得扁平、易读。掌握它们,你才能真正体会到 Rust 在追求零成本抽象和极致人体工程学上的良苦用心。继续加油,Rustacean!🦀。

Xiaofan1121的博客 949
上一篇: Rust之枚举和模式匹配(二):控制流程结构match
下一篇: Rust之包,箱和模块管理(一):包和箱
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值