Rust 中的流程控制语句称为 流程控制表达式。编程
表达式必定会有之,因此 if 表达式的分支必须返回同一个类型的值才能够。这也是 Rust 没有三元操做符的缘由。 If 表达式的求值规则和块表达式一致。数组
fn main () {
let n = 13;
let big_n = if (n < 10 && n > -10) {
10 * n
} else {
n / 2
}
assert_eq!(big_n, 6)
}
复制代码
上述代码中, big_n 的赋值是由一个 if 表达式来完成的。 经过计算 n 区间大小,来决定最终的值。由于 n 是 13, 虽然没有明确指定类型,但 Rust 会推断其为 i32 类型,在 if 条件分支中,对 n 求积获得的结果确定是整数。 Rust 已经将 big_n 推断类型为 i32 因此在计算 n 除以 2 的时候,Rust 编译器会对结果进行截取,去除小数点后面的部分。最终结果为 6markdown
Rust 中包括了三种循环表达式: while、loop 和 for … in 表达式,用法与其余语言一致数据结构
fn main () {
for n in 1..101 { // 1..101 迭代器 Range 0 ~ 101
if n % 15 == 0 {
println!("fizzbuzz");
} else if n % 3 === 0 {
println!("fizz");
} else if n % 5 == 0 {
println!("buzz");
} else {
println!("{}", n);
}
}
}
复制代码
for ... in
表达式本质山是一个迭代器,其中 1..101
是一个 Range
类型,是一个迭代器。 当须要使用无限循环的时候,必定要使用 loop
循环,避免使用 while true
循环。编程语言
fn while_true (x: i32) -> i32 {
while true {
return x + 1;
}
// 修复此处函数报错须要在此处加一个返回值
x
}
fn main () {
let y = while_true(5);
assert_eq!(y, 6)
}
复制代码
此段代码在编译器中会报错,错误提示成,while true 模块返回的是单元值,而函数 while_true 返回值是 i32,因此不匹配。 这是由于 Rust 编译器在对 while 循环作流分析(Flow Sensitive) 的时候,不会检查循环条件,编译器认为 while 循环条件可真可假,因此循环体内的表达式也会被忽略,此时编译器只知道 while true 循环返回的是单元值,而函数的返回时 i32,因此抛出错误,这一切都是由于 CTFE 功能的限制,while 条件表达式没法做为编译器常量来使用。函数
Rust 提供了 match 表达式oop
fn main () {
let number = 42;
match number {
0 => println!("Origin"),
1...3 => println!("All"),
| 5 | 7 | 13 => println!("Bad Luck"),
n @ 42 => println!("Answer is {}", n),
_ => println!("Common")
}
}
复制代码
Match 用于匹配各类状况,相似于 switch case 语句学习
Match 分支使用了**模式匹配(Pattern Matching)**技术。模式匹配在数据结构字符串中京城出现,好比在某个字符串中找出与该子串相同的全部淄川。 在编程语言中,模式匹配用于判断类型或值是否存在能够匹配的模式。spa
在 Rust 语言中,match 分支左边就是模式,右边就是代码。模式匹配同时也能够是一个表达式,和 if 表达式相似,全部分支必须返回同一个类型。可是左侧的模式能够是不一样的。 代码中,使用的模式分别是 单个值、范围、多个值和通配符。其中 操做符 @ 能够将模式中的值绑定给一个变量,供分支右侧代码使用,这类匹配叫** 绑定模式(Binding Mode)。** match 表达式必须穷尽每一种可能,因此通常状况下,会使用 通配符_
来处理剩余状况。 除了 match 表达式,还有 let 绑定、函数参数、for 循环等位置都用到了模式匹配。指针
Rust 提供了if let
和 while let
表达式,分别用来在某些场合替代 match 表达式。
fn main () {
let boolean = true;
let mut binary = 0;
if let true = boolean {
binary = 1;
}
assert_eq!(binary, 1);
}
复制代码
代码清单中使用了 if let
表达式,和 match 表达式类似, if let
左侧为模式,右侧为要匹配的值。若是 boolean 为 true,binary 值修改成 1。 在使用循环的某些场合下,也可使用 while let
来简化代码
fn main () {
let mut v = vec![1, 2, 3, 4, 5];
loop {
match v.pop() {
Some(x) => println!("{}", x),
None => break,
}
}
}
复制代码
在上述代码中,建立了动态数组 v,而且想要将其中的元素经过 pop 方法一次去出并打印。此处使用 loop 循环,由于调用 v 的 pop 方法会返回 Option 类型。因此用 match 匹配两种状况, Some(x) 和 None。 Rust 中引入 Option 类型时为了防止空指针的出现。Some(x) 用于匹配数组汇总的元素,而 None 用于匹配数组被取空的状况,当数组为空时,就从循环中跳出(break)。
while let
对上述代码作简化
fn main () {
let mut v = vec![1,2,3,4,5];
while let Some(x) = v.pop() {
println!("{}", x);
}
}
复制代码
代码中,使用了 while let
表达式,与if let
相似,其左侧 Some(x)为匹配模式,会匹配右侧 pop 方法调用返回的 Option 类型结果,并自动建立 x 绑定供 println! 宏语句使用,若是数组中的值去空,则自动跳出循环。
#Rust学习