前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rust流程控制:if let和while let

Rust流程控制:if let和while let

作者头像
灯珑LoGin
发布2023-10-18 10:40:52
1920
发布2023-10-18 10:40:52
举报
文章被收录于专栏:龙进的专栏龙进的专栏

与C相比,Rust多了if let和while let这两个流程控制语句,因为之前我没有接触过这种,因此第一感觉就是有点抽象。

if let语句

先来看个具体的场景:

代码语言:javascript
复制
// Make `optional` of type `Option<i32>`
let optional = Some(7);

match optional {
    Some(i) => {
        println!("This is a really long string and `{:?}`", i);
    },
    _ => {},
};

对于上面这个“只需要匹配一个分支”的场景,我们想要当optional变量为Some的时候,执行一些操作。为了实现这样的目标,我们引入了match语句。而match语句要求我们必须为其他情况编写一个处理分支,这显得不是那么的雅观。if let语句的引入正是为了改善上述代码的整洁度。

使用if let语句后,可以将上述代码等价转换为:

代码语言:javascript
复制
if let Some(i) = optional {
     println!("This is a really long string and `{:?}`", i);
}

其中,上述if let语句读作:“若 letoptional 解构成 Some(i),则执行{}中的代码”。

仔细对比就可以发现,if let其实就是相当于match的简化版,它只匹配一个分支,当匹配条件不满足的时候,就不执行后面的{}中的代码。这样,我们就不用编写一个match语句了,使得代码更加整洁。

对于匹配失败的情况,我们允许在if let语句后面跟上一个else,当匹配失败时,将执行else的内容。其实就是相当于最开始的 _=> {} 分支。

代码语言:javascript
复制
if let Some(i) = optional {
     println!("This is a really long string and `{:?}`", i);
}else{
     println!("failed.");
}

while let语句

与if let类似,while let语句解决的是下面这个“循环匹配一个分支“的场景中,match语句带来的复杂性的问题。

代码语言:javascript
复制
// 将 `optional` 设为 `Option<i32>` 类型
let mut optional = Some(0);

// 重复运行这个测试
loop {
    match optional {
        // 如果 `optional` 解构成功,就执行下面语句块。
        Some(i) => {
            if i > 9 {
                println!("Greater than 9, quit!");
                optional = None;
            } else {
                println!("`i` is `{:?}`. Try again.", i);
                optional = Some(i + 1);
            }
            // ^ 需要三层缩进!
        },
        // 当解构失败时退出循环:
        _ => { break; }
    }
}

上面的代码需要三层的缩进,看起来不是那么美观。由于我们只是想循环的匹配optional变量是Some(i)的这个种情况,在这里写loop{match{}}就有点大材小用了。

上述代码可以等价的转换为:

代码语言:javascript
复制
let mut optional = Some(0);
while let Some(i) = optional {
        if i > 9 {
            println!("Greater than 9, quit!");
            optional = None;
        } else {
            println!("`i` is `{:?}`. Try again.", i);
            optional = Some(i + 1);
        }
}

上述while let读作“只要let能optional 解构成 Some(i),则执行{}中的代码,直到optional不再能被解构成Some(i)为止”。所以,while let语句其实就是相当于只有一个待匹配分支的loop{match{}}语句块的功能。

参考资料:

https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html

https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • if let语句
  • while let语句
  • 参考资料:
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档