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

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

6.4.1. 什么是if let

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

可以把if let看作是match的语法糖,也就是只针对某一种特定的模式来允许代码。

6.4.2. if let的应用

举个例子:v是一个u8类型的变量,判断v是否是0,是0就打印zero

rust 复制代码
use rand::Rng;  // 使用外部库
fn main(){  
    let v: u8 = rand::thread_rng().gen_range(0..=255);  // 生成随机数
    println!("{}", v);  
    match v {  
        0 => println!("zero"),  
        _ => (),  
    }  
}

这里只用分辨0和非0两种情况,在这种情况下使用if let就会更简单:

rust 复制代码
fn main(){  
    let v: u8 = rand::thread_rng().gen_range(0..=255);  // 生成随机数  
    println!("{}", v);  
    if let 0 = v {  
        println!("zero");  
    };  
}

注意:if let用的是=而不是==

小改一下上面的例子:v是一个u8类型的变量,判断v是否是0,是0就打印zero,不是就打印not zero

rust 复制代码
use rand::Rng;  // 使用外部库
fn main(){  
    let v: u8 = rand::thread_rng().gen_range(0..=255);  // 生成随机数
    println!("{}", v);  
    match v {  
        0 => println!("zero"),  
        _ => println!("not zero"),  
    }  
}

这种情况下只需要给if let加上else就行:

rust 复制代码
fn main(){  
    let v: u8 = rand::thread_rng().gen_range(0..=255);  // 生成随机数  
    println!("{}", v);  
    if let 0 = v {  
        println!("zero");  
    } else {
	    println!("not zero");
    }
}

6.4.3. 使用if let的取舍

if let相比match有更少的代码,更少的缩进和更少的模版代码。但if let放弃了穷举的可能。

所以说使用if let还是match需要根据实际需求来决定,这之间存在简洁性与穷尽性的取舍问题。

6.4.5. if let 与 if 的区别

很多初学者搞不清if let与if的区别,因为好像if let能做的if也能做,但它们两个有本质上的区别:if let是模式匹配,if是判断语句。

if后面的条件只能是布尔类型,而if else是匹配是否符合某个具体的模式,适合从枚举、Option、Result或其他支持模式匹配的类型中提取值。

如例:

rust 复制代码
fn main(){
	let x = Some(5);
	if let Some(value) = x {
	    println!("Found a value: {}", value);
	} else {
	    println!("No value found");
	}
}

if就做不到解包Option,想要实现这样的效果就只能使用模式匹配(match和if let)。

相关推荐
旖旎夜光1 分钟前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
恋猫de小郭7 分钟前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter
你看我名字13 分钟前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
严肃小白兔1 小时前
TanStack Router 更新构建工具链:Node.js 兼容性、路由分割与前端工程实践
前端·node.js·状态模式
IT_陈寒1 小时前
Vue这个奇葩的响应式问题让我加班到凌晨
前端·人工智能·后端
老秦包你会1 小时前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
旖旎夜光1 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
风骏时光牛马1 小时前
功能可用性自动化测试验证
前端
Wang's Blog10 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
LucianaiB11 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程