开发中最常见的用来控制执行流的结构是判断和循环。
判断
Rust 中的 if 表达式允许根据条件执行不同的代码分支,提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。”
需要注意的是,Rust 是静态语言,因此无法自动将 int 之类的值转换为 bool , 也就是如下的代码会报错:
fn main()
{
let num : i32 = 6
if num {
println!("if 内")
}
}
当然 “num == 6” 这种是允许的;并且如果条件只有一条语句的情况下,是可以不加括号的
Rust 的 if 也支持 else 的分支结构, 并且支持将 if 条件作为表达式使用,也就是 if 可以返回值,比如:
另外由于当一个判断有多个分支时,使用 else 会导致代码的杂乱,因此 Rust 提供了一种 match 分支结构,来避免这种问题;
match 是一种极为强大的控制流运算符,它允许开发者将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成;match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。
match 的使用方法是match 关键字后跟一个表达式,然后用大括号将要检测的所有值包起来,最后在判断的值之后用 => 运算符将值和匹配成功后将要运行的代码分开,最后在分支代码尾部加一个逗号分隔开,或是直接将整个分支也用大括号包起来。例如可以像这样写:
fn main()
{
let x : i32 = 1;
match x {
1 => {
println!("x = 1")
}
2 => println!("x = 2"),
_ => println!("x = 3"),
}
}
看到这,第一反应就是这不就是 switch 吗,但其实还是有一些不同:
* 在Rust中,match 是一个表达式,也就是它可以返回值。而在其他一些语言中,switch是一个语句,不能返回值。
* Rust 的 match 必须穷尽所有可能的情况,并且提供了 _ 通配符来表示未指定的情况。如果不满足任何一个模式,编译器将会发出警告。
* Rust 的 match 能够处理复杂的模式匹配,例如枚举类型、结构体以及嵌套模式。而其他一些语言中的switch仅能匹配基本数据类型。
* match 在 Rust 中使用 => 来关联模式和执行代码块,而其他语言中通常使用 : 或 -> 。
* Rust 的 match 不需要使用break之类的方式打断,匹配成功之后只会执行匹配到的分支的代码;
总的来说,Rust的match更加强大且安全,因为它是一个表达式,并且需要穷尽所有可能的情况。
这里其实想写个match 结构体的例子的,但是按照C++的方式定义结构体没写出来一堆报错。。。。等后面看到结构体和类再写吧。。。。
循环
Rust 中提供了三种循环关键字: loop while for
for 和 while 应该是绝大多数编程语言都有的关键字,用法也没什么特殊的,就不细述了,看例子就可以了:
loop 关键字会不停的执行代码直到明确要求停止,可以使用 break 关键字来告诉程序何时停止循环,并且 loop 也支持返回表达式,具体看下面的代码:
这段代码,首先在 loop 中不停的对 index 进行单步增长1的操作,然后增长之后判断当前是否已经增长到10,到10 就调用break 退出,同时返回当前值 * 101;
Rust 还有一个特性,如果存在嵌套循环,break 和 continue 只会应用于此时最内层的循环。此时可以选择在一个循环上指定一个 循环标签(loop label),然后将标签与 break 或 continue 一起使用,使这些关键字应用于标记的循环而不是最内层的循环。比如将刚才的代码改一下:
首先给最外层循环定义了一个标签 outloop,然后在内部循环中检测,如果index == 3 就中断内层循环,并返回index*101(这里返回值变量被我删掉了,所以这个返回值其实没有用)。 接下来再检测,如果当前外部循环索引变量到了2,就使用break 中断 outloop 这个循环,至此程序结束。