流程控制

rust代码是从上至下顺序执行的,在这个过程中,可以通过循环,分支等流程控制方式来实现相应的逻辑。

if-else

rust的if-else和其它语言中的类似,但是if-else在rust中是一个表达式,并且所有分支必须返回相同的类型。下面通过例子来具体看看。

fn main() {let a = 1;let b = 2;if a > b {println!("{}", "a>b");}else {println!("{}", "a<=b");}let c = if a > b {println!("{}", "a>b");a}else {println!("{}", "a<=b");b};          // 当if-else表达式的值被let语句使用的时候,需要在最后加上分号,并且保证a,b返回的值是同类型。println!("{}", c);  // c的值是由if表达式执行到的分支所确定的,因此c的值是2
}

rust的条件表达式不需要使用括号包括起来。除此之外rust的if表达式还有一个if let,由于if let本质上是和match一样的模式匹配,不在此处描述。

使用else if处理多重条件

和其它语言类似,rust的if-else语句可以有大量的分支用来处理多重条件。例如:

fn main() {let n = 6;if n % 4 == 0 {println!("number is divisible by 4");} else if n % 3 == 0 {println!("number is divisible by 3");} else if n % 2 == 0 {println!("number is divisible by 2");} else {println!("number is not divisible by 4, 3, or 2");}
}

程序执行时,会按照自上至下的顺序执行每一个分支判断,一旦成功,则跳出 if 语句块,最终本程序会匹配执行 else if n % 3 == 0 的分支,输出 “number is divisible by 3”。有一点要注意,就算有多个分支能匹配,也只有第一个匹配的分支会被执行!(例如这段代码中的number is divisible by 2虽然匹配成功,但是不会被执行。)

for循环

rust的for循环和python,javascript的for循环看起来很像,语义如下:

for 元素 in 集合 {// 使用元素
}

注意,使用 for 时我们往往使用集合的引用形式,这能避免集合的所有权转移。(除非你之后不再使用该集合),如果是实现了Copy trait的数组,那么不会导致所有权的转移。如果想在循环中,修改该元素,可以使用mut关键字。例如:

for num in &mut nums  {     // 可变引用,修改元素的值*num += 3;              // 注意这里需要手动解引用,
}
println!("{:?}", nums);

获取元素索引

在循环中获取元素的索引,可以使用下面的方式。

for (i, v) in nums.iter().enumerate() {println!("第{}个元素是{}", i, v);
}

下表是可变引用,不可变引用,转移所有权的等价使用方式。

使用方法 等价使用方式 所有权
for item in collection for item in IntoIterator::into_iter(collection) 转移所有权
for item in &collection for item in collection.iter() 不可变借用
for item in &mut collection for item in collection.iter_mut() 可变借用

for循环能够对迭代器进行循环迭代。(正如上面表格中的等价形式一样,for是对迭代器进行的。)

控制循环执行次数

下面是一个使用for循环控制循环体执行10次的例子。

for i in 0..10 {println!("{}", i);
}

如果你不需要使用i,那么可以使用_来代替。在 Rust 中 _ 的含义是忽略该值或者类型的意思,如果不使用 _,那么编译器会给你一个 变量未使用的 的警告。例如:

for _ in 0..=10 {println!("Hello rust!");
}

continue

和其它编程语言一样,continue都是跳过本次循环,开始下次循环。例如:

for i in 0..=10{if i % 2 == 0 {continue;}println!("{}", i);
}

程序执行结果如下所示:

1
3
5
7
9

break

和其它编程语言一样,break可以跳出整个循环,使当前循环结束。例如:

for i in 1..9 {if i == 5 {break;}println!("{}", i);
}

程序执行结果如下所示:

1
2
3
4

while循环

while循环相比for循环,可能没有那么常用。当循环条件为 true 时,继续循环,条件为 false,跳出循环。例如:

let mut count = 0;
while count < 3 {println!("{}", count);count += 1;
}

loop循环

rust提供了loop循环,它是一个简单的无限循环。因此在使用loop循环的时候要格外小心,如果你忘记配合break来使用,那程序可能就在循环里永远出不来了。另外一点是loop循环是一个表达式,而for和while循环不是。例如:

let result = loop {count += 1;if count == 10 {break count * 2;}
};
println!("{}", result);

这段代码中,通过break带回了返回值。打印出20

循环标签

和大多数语言一样,再存在多层循环嵌套的情况下,break 和 continue 应用于此时最内层的循环。rust提供了标签结合continue,break来使用,使这些标签应用于已标记的循环而不是内层的循环。例如:

fn main() {let mut count = 0;'outer: loop {'inner1: loop {if count >= 20 {// 这只会跳出 inner1 循环break 'inner1; // 这里使用 `break` 也是一样的}count += 2;}count += 5;'inner2: loop {if count >= 30 {break 'outer;}continue 'outer;}}assert!(count == 30)
}

这段代码需要仔细看,不能大意。因为有的break和continue是跳到某一个标签,而不是最内层的循环。循环标签使得循环更加强大,但是带来的后果是使得代码的逻辑变得更加复杂难懂。非必要不使用循环标签。

参考资料

  1. rust程序设计语言
  2. rust语言圣经

rust语言流程控制相关推荐

  1. R语言入门4---R语言流程控制

    ​ 流程控制语句在任何语言中都是非常重要的,通过流程控制语句编程者能够根据业务逻辑在程序中设计合理的循环.分支,实现程序各种各样强大的功能.一般实现任一算法的控制结构都可以分为顺序结构.分支结构.循环 ...

  2. c语言循环次数控制,3 C语言 流程控制 循环 跳转

    3 C语言 流程控制 循环 跳转 选择: if switch 循环   while,do while ,for ,嵌套 跳转 break goto continue 第3章流程控制 学习目标 u掌握选 ...

  3. 易语言流程控制程序暂停开始继续

    易语言并没有直接对流程控制的命令,我们可以采用逻辑变量,时钟的时钟周期是否为0来进行流程的 控制. 一.使用变量控制程序的暂停和继续 .版本 2.程序集 窗口程序集_启动窗口 .程序集变量 是否暂停, ...

  4. 511遇见易语言流程控制返回和结束和销毁

    返回()是易语言中常用的命令,但对返回值的类型控制我们有时候并不是很清楚,教程用了四个例子讲解了返回,二结束和销毁更是容易混淆的两个命令,视频分别做了演示. 511遇见易语言教程 一.官方源码 返回 ...

  5. 江哥带你玩转C语言 | 07 - C语言流程控制

    流程控制基本概念 默认情况下程序运行后,系统会按书写顺序从上至下依次执行程序中的每一行代码.但是这并不能满足我们所有的开发需求, 为了方便我们控制程序的运行流程,C语言提供3种流程控制结构,不同的流程 ...

  6. 511遇见易语言流程控制计次循环首

    计次循环首子易语言循环命令中是使用非常频繁的一个命令,视频教程罗列了多个历程说明示范了该命令的使用技巧. 511遇见易语言教程 一.官方文档 调用格式: 〈无返回值〉 计次循环首 (整数型 循环次数, ...

  7. 511遇见易语言流程控制(循环判断首和判断循环首)

    循环判断首和判断循环首无论从字眼上和使用上都比较容易混淆,所以把这两个命令放在一起讲解,通过举例来学习的它们的区别和联系,以及使用技巧. 511遇见易语言教程 一.官方源码 判断循环首 (逻辑型 条件 ...

  8. php与c语言流程控制语句,小蚂蚁学习C语言(7)——C语言流程控制之if

    其实我感觉只要学过一门编程语言的人都会使用. 流程控制(非常重要) 1,什么流程控制 控制程序的执行顺序 流程控制的重要性 一通百通 C++ java C+ 都是一样的. 等等--总之就是非常的重要 ...

  9. goto语句_11. Go语言流程控制:goto 无条件跳转

    本文原文:http://golang.iswbm.com Github:https://github.com/iswbm/GolangCodingTime Go里的流程控制方法还是挺丰富,整理了下有如 ...

最新文章

  1. iOS 实现多个可变 cell 复杂界面的制作
  2. js垃圾回收机制和引起内存泄漏的操作
  3. mysql isam参数优化_MySQL MyISAM优化设置点滴
  4. HBase的布隆过滤器详解
  5. 计算机地址栏搜索不了网,我的电脑地址栏不见了怎么办 地址栏不见了如何解决...
  6. XP设置文件夹默认打开方式改为“资源管理器”
  7. pxe装机dhcp获取不到_关于PXE服务器环境搭建流程中遇到的问题及解决方法
  8. CGIC库的移植及使用
  9. 静态网页制作作业_HTML CSS复习之制作静态网页
  10. wordpress页面前端添加编辑按钮
  11. 深入浅出设计模式(一)
  12. Linux之——udp端口测试连接
  13. windows7下预览psd
  14. php html block,html blockquote怎么用?blockquote标签的用法介绍
  15. ubuntu20 关闭防火墙_ubuntu中如何关闭防火墙
  16. radmi4a Android,红米4A(Redmi 4A 全网通)一键ROOT教程,看教程ROOT
  17. centos路由查看命令_centos查看ip
  18. Design compiler综合教程
  19. 练习2-4:重新编写函数squeeze(s1,s2),将字符串s1中的任何字符与字符串时s2中的字符匹配的字符都删除
  20. 双网卡实现同时连通两个网络

热门文章

  1. collectors 求和_Collectors.groupingBy() 分组、求和、统计、平均、最大(小)值
  2. 微信小程序解析HTML标签
  3. 图形学实验:简单几何体的平移,缩放,旋转等几何变换,进行图形化交互
  4. 统计学习方法--KL散度的定义和狄利克雷分布的性质
  5. 单链表逆置C语言编程实现
  6. SQL 去除重复数据 UNION all 和UNION 的用法
  7. 自学python能干什么工作_自学python能干什么
  8. [转] 钉钉的H5性能优化方案
  9. sqlmap工具之参数使用
  10. 二本4年Java经验,五面阿里艰苦经历(定薪45K),回馈一波心得体会