欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 【Rust自学】6.4. 简单的控制流-if let

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

2025/9/27 1:23:58 来源:https://blog.csdn.net/weixin_71793197/article/details/144708909  浏览:    关键词:【Rust自学】6.4. 简单的控制流-if let

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

6.4.1. 什么是if let

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

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

6.4.2. if let的应用

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

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就会更简单:

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

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就行:

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 letif的区别,因为好像if let能做的if也能做,但它们两个有本质上的区别:if let是模式匹配,if是判断语句。

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

如例:

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词