流程控制 与 Range 类型
前言
任何一门编程语言几乎都脱离不了:变量、基本类型、函数、注释、循环、条件判断,这是一门编程语言的语法基础,只有当掌握这些基础语法及概念才能更好的学习 Rust。
条件判断
if 表达式
if 语句在其他语言中很常见,这里不再多做解释,看注释即可。
1 | |
if 表达式也支持 if...else if...else 语句:
1 | |
在 Rust 中,没有像其他语言那样的三元表达式(三目运算符),但是在 Rust if 是一个表达式,这意味着可以在 let 语句中使用它来对变量进行条件赋值,从而达到类似三元表达式的效果。
1 | |
模式匹配(match 表达式)
虽然严格来说 match 并不是条件判断,但它常作为 Rust 的条件控制结构,其功能类似于其他语言中的 switch / case 语句。match 针对一个值执行模式匹配,并根据匹配到的模式执行相应的代码。
1 | |
match 匹配必须是穷尽的(exhaustive),也就是说所有可能的值都必须被考虑。使用 _ 模式可以捕捉所有未显式处理的值。
match 守卫(match guards)允许你为同一个 match 分支添加额外的条件判断,这样就可以基于值的属性做更精细的控制。
1 | |
循环语句
loop 循环
loop 关键字创建了一个无限循环,它会不断地重复代码块,直到明确地通过 break 关键字退出循环。
1 | |
loop 也能返回一个值,这个值是在 break 后跟着的表达式。
1 | |
while 循环
while 循环在循环的每次迭代开始前检查条件表达式,只有当条件为真时才会执行循环体。如果条件为假,则退出循环。
1 | |
和其他语言不一样在,Rust 中没有 do...while 语句,如果想要实现类似的效果可以通过 loop + if 模拟。
1 | |
for 循环
for 循环是开发中使用最频繁的循环,尤其是需要迭代一个序列或迭代器时。对于集合中的每个元素,它都会执行一次循环体。for 循环更加安全和高效,而且它不会产生越界的风险。
1 | |
for 语句的特点
Rust 语言中的 for 循环不支持传统的 C/C++ 风格的 for (initialization; condition; update) 循环。在 Rust 中,for 循环被设计成基于迭代器的,这意味着它是用来遍历迭代器中的元素。之所以这样设计,是为了更安全和直接地处理集合中的元素,而不需要像在 C/C++ 中那样手动管理索引。
如果你想要执行类似于 for (int i = 0; i < 10; i++) 的循环,Rust 提供了一个 Range 类型,可以通过这个类型的 .. 或 ..=(包含上界)运算符来创建。
Rust 的 for 循环进行迭代示例如下:
1 | |
注意:Range 类型产生的数值并不包括区间的上界,需要使用 ..= 语法才可以。当需要类似 C/C++ 风格的循环控制时,通常可以使用 Range 类型,这种方式也避免了因手动处理索引导致类似越界访问的错误。
Range 类型
在 Rust 中,Range 是一种迭代器类型,它生成一系列按顺序排列的数字。Range 通常用于 for 循环中,提供了一种简便的方式来执行重复操作一定次数的任务。
这里有两种最常用的 Range 类型:
Range(start..end): 创建一个从start到end(不包括)的迭代器,也就是左闭右开的区间。RangeInclusive(start..=end): 创建一个从start到end(包括)的迭代器,闭区间,包含结束值。
创建 Range:
Range 通过使用两个点 .. 运算符来创建:
1 | |
创建 RangeInclusive:
RangeInclusive 通过使用三个点 ..= 运算符来创建:
1 | |
这两种类型都是迭代器,可以使用它们的 next 方法来逐个获取值,或者使用 for 循环来遍历这些值。
常用方法
Range 类型支持很多操作方法,下面列举几个常用的。
rev
rev 方法可以用来反转范围,创建一个新的迭代器,它会按照相反的顺序产生数值。
1 | |
count
返回迭代器中剩余的元素数量。
1 | |
start_bound 和 end_bound
返回Range的起始边界和结束边界。返回的是一个Bound枚举,可以是Included(包含边界值)或Excluded(不包含边界值)。
1 | |
contains
判断一个指定的数值是否在Range内。如果是start..end类型的Range,会判断这个值是否大于等于start且小于end。
1 | |
next
迭代Range并返回下一个值,如果迭代已经完成则返回None。
1 | |
last
返回Range中的最后一个数值,对 start..end 类型的Range来说,这个值是end - 1。
1 | |
nth
获取迭代器中的第n个元素,并且将迭代器前进到此位置后面的元素。
1 | |
step_by
创建一个每n个数值产生一次的迭代器。
1 | |
其他
这个只列举了最常用的一些方法,Range 还支持很多其他的方法,此外,由于 Range 和 RangeInclusive 实现了 Iterator trait,因此提供了所有迭代器的标准方法,如 map, filter, fold, 和 collect 等。
结语
本章介绍了条件判断、循环语句以及 Range 类型,这是在程序开发中最常用的语句。在 Rust 中,不支持 do...while 、for ( i = 0; i <10; i++ ) 、三元运算符 这类语法,但是可以用其他语法平替,这是从其他语言切换到 Rust 开发时需要注意的。