Rust 循环语句
现实的世界很无奈,因为它是线性的,流水线形式的。
过完今天,还有明天,过完明天,还有后天。
具体到每一天,无外乎是
睡醒 -> 早餐 -> 上班/上学 -> 午餐 -> 上班/上学 -> 回家 -> 晚饭 -> 睡觉
虽然站在每天的角度考虑,生活真的是顺风顺水,流水作业。但如果站在上帝的视角,白天生活无外乎是
吃饭 -> 工作 -> 吃饭 -> 工作 -> 吃饭 -> 工作
好像陷入了一种死循环的状态。
如果我们把时间缩短到每个小时,那么白天的生活几乎就是
9:30 上班 10:30 上班 11:30 上班 12:00 下班 13:30 上班 14:30 上班 15:30 上班 16:30 上班 17:30 上班 18:30 下班
如果你撇开时间不看,那白天都在上班上班上班....这样循环下去。
即使加入了时间,看起来除了 12:00 和 18:30 是下班外,每个小时都在循环工作的赶脚。
循环 其实就是一种重复,在满足指定的条件下,重复的做某些事情。就好比如只要时间没到 18:30,那么我们一直在重复的上班。
编程语言是模拟现实生活的,如果你有哪块搞不清楚,那么只要从现实生活中找例子即可。
编程语言也有循环这种概念,也可以在满足指定的条件下,重复的执行一部分代码,我们把这种重复执行的代码称之为 转换语句
Rust 中的循环
循环语句允许我们多次执行语句或语句组。
循环语句就是在指定条件为真的情况下重复的执行代码。
这个重复的过程,我们使用一张图来描绘就会像下面这样子
有时候不得不感慨中文的博大精深,就一个重复执行的动作,我们有很多种描述方法
- 太阳每天都东升西落。在人的生命周期中,永远看不到结束的时候,这是一种死循环。
- 只要还趴下住院,你就一直要重复的工作...。这是一种有条件的循环,只要条件为真就要重复执行。
- 做错了事,总是被罚站 30 分钟。1分钟...2分钟...30 分钟。这种循环有初始化,有临界条件,还会自动递增时间。
对应着上面三种重复,Rust 语言中也有三种表示 循环 的语句:
loop
语句。一种重复执行且永远不会结束的循环。while
语句。一种在某些条件为真的情况下就会永远执行下去的循环。for
语句。一种有确定次数的循环。
三种语句都能实现循环功能,只不过侧重点不一样。
从上面的描述中,根据循环是否可能结束,我们把循环分为两大类
- 能确定次数的循环,比如
for
循环。 - 满足条件就是永动机的循环。比如
while
循环。 - 死循环。比如
loop
循环。
for
循环语句
for
语句是一种能确定循环次数的循环。
for
语句用于执行代码块指定的次数。
可能和其它语言有所不同,Rust 中的 for
循环只有 for..in
这种格式,常用于迭代一组固定的值,例如数组、向量等。
for
循环语句的语法格式
for temp_variable in lower_bound..upper_bound { // action 要重复执行的代码 }
-
lower_bound..upper_bound
用于指定循环区间,是一个左闭又开的区间,比如1..3
则只有1
和2
不包含3
-
temp_variable
是循环迭代的每一个元素。 -
temp_variable
变量的作用域仅限于for...in
语句,超出则会报错
范例: 基本的 for...in 循环
下面的代码,使用 for...in
循环,重复输出 1 到 11 之间的数字(不包括 11 )
fn main(){ for x in 1..11{ println!("x is {}",x); } }
编译运行以上 Rust 代码,输出结果如下
x is 1 x is 2 x is 3 x is 4 x is 5 x is 6 x is 7 x is 8 x is 9 x is 10
while
循环
while
语句是一种只要条件为真就一直会重复执行下去的循环。
while
循环会在每次重复执行前先判断条件是否满足,满足则执行,不满足则退出。
while
语句的语法格式
while ( condition ) { // action 要重复执行的代码 }
condition
是一个表达式,返回的结果会转换为 布尔类型。只要 condition
返回真,那么循环就会一直执行。
范例: 基本的 while
循环
下面的代码,使用 while
循环重写下上面的代码,重复输出 1 到 11 之间的数字(不包括 11 )
fn main(){ let mut x = 1; while x < 11{ println!("inside loop x value is {}",x); x+=1; } println!("outside loop x value is {}",x); }
编译运行以上 Rust 代码,输出结果如下
inside loop x value is 1 inside loop x value is 2 inside loop x value is 3 inside loop x value is 4 inside loop x value is 5 inside loop x value is 6 inside loop x value is 7 inside loop x value is 8 inside loop x value is 9 inside loop x value is 10 outside loop x value is 11
看到最后的 outside loop x value is 11
没,因为当 x 递增到 11
就不再满足条件 x < 11
了。
loop
循环
loop
语句代表着一种死循环。它没有循环条件,也没有循环次数,它就是一个永动机。
loop
语句的语法格式
loop { // action 要重复执行的代码 }
范例:loop
循环的基本使用
下面的语句,我们使用 loop
输出 1 到无限大的数字。
实际上是不可能的
fn main(){ let mut x = 0; loop { x+=1; println!("x={}",x); } }
编译运行以上 Rust 代码,输出结果如下
x=1 x=2 x=3 ... ... x=61^Cx=612514 x=612515 x=612516
这是一个死循环,如果不出意外是不会停下来的。需要我们手动退出程序,这时候你可以按下 CTRL + C
组合建退出程序。
注意
任何程序,如果进入死循环,你可以按下
CTRL + C
组合键退出程序。
循环控制语句 break
好啦好啦,我们已经学会了三大循环语句了,大家用起来感觉如何???
在日常的编程中,不知道大家有没有这样的请求,如果 action 语句块中也能退出循环就好了。
哈哈,为了响应这个请求,语言的开发者们早点就想到了这一块了,于是有了 break 语句。
也就是说 break 语句的出现,就是为了在 action 语句块中可以退出循环语句。
break 语句的语法
break 语句的语法格式如下
break;
很简洁,不拖泥带水的。
范例
小试牛刀一下,我们使用 break 语句改造下我们的 loop
循环,在 x 大于 11 就退出循环。
也就是使用 loop 循环实现 while 循环
fn main(){ let mut x = 0; loop { x+=1; if x > 10 { break; } println!("x={}",x); } }
编译运行以上 Rust 代码,输出结果如下
x=1 x=2 x=3 x=4 x=5 x=6 x=7 x=8 x=9 x=10
循环控制语句 continue
break 语句让我们尝到了甜头,有时候我们就会突发奇想,有没有另一个关键字,不像 break 语句那样直接退出整个循环,而仅仅是退出当前循环。也就是剩下的语句不执行了,开始下一个迭代。
创造了那些语言的前辈们,自然也会有这个想法,于是造出了 continue 语句。
continue
语句,简单的说,就是停止执行剩下的语句,直接进入下一个循环。
continue 语句的语法格式
continue 语句的语法格式如下
continue;
范例
下面的代码,我们使用 for
循环输出 1 到 11 之间的数字,但是跳过数字 5
fn main(){ for x in 1..11{ if 5 == x { continue; } println!("x is {}",x); } }
编译运行以上 Rust 代码,输出结果如下
x is 1 x is 2 x is 3 x is 4 x is 6 x is 7 x is 8 x is 9 x is 10