控制流
阅读本篇时请确定自己了解过其他语言的控制流,因为本篇只介绍用法而不解释运行顺序。
Rust提供了4种控制流:if
、while
、loop
、for
。
与某些语言不同的是,Rust控制流中的条件表达式都不需要用括号()
包围(加不加括号都可以编译,建议不加),并且控制流的花括号{}
不可省略。
if
和else
格式:
1 | if condition { |
例:
1 | if 1 + 1 == 2 { |
while
循环
格式:
1 | while condition { |
loop
循环和break
格式:
1 | loop { |
loop
块内的语句会一直执行,如何跳出后文再说。
for
循环
格式:
1 | for varname in iter/range { |
例:
1 | fn main() { |
输出:
1 | 123123 |
字面值0..3
的类型是区间(Range
),0..3
代表左闭右开数列:{0
、1
、2
},相应的a..=b
表示{a
、a+1
、...、b
}。有兴趣了解的话可以看看std::ops::Range
,Range
功能较多,这里就不过多展开了。
continue
和break
continue
和break
可以在所有循环语句(while
、loop
、for
)中使用。
continue
用于跳过循环,break
用于跳出循环。
continue;
或break;
只对当前循环有效,要指定循环可以在循环语句前添加标签(标签名格式为'tagname
)和:
,然后使用语句continue 'tagname;
或break 'tagname
。
例: 1
2
3
4
5
6
7
8
9
10
11
12
13fn main() {
let mut ct = 0;
'wh: while ct > -1 {
ct += 1;
'fo: for a in 0..2 {
if ct == 2 {
break 'wh;
} else if a == 1 {
continue 'wh;
}
}
}
}
match
匹配
match
匹配有三种可混合嵌套使用的用法:值匹配、条件匹配、类型匹配,这里先只介绍值匹配和条件匹配。
类型匹配的内容将在初识枚举中介绍。
值匹配
其中,值匹配用法比较类似C/C++中的switch
,下面是值匹配示例:
1 | let mut a = 1; |
因为a == 1
所以上面的match
会匹配到1
并执行a += 1
。
注意,所有匹配语句之间无关联,例如上面a
匹配到1
后就只会执行a += 1
,而不会执行a += 3
、{ a+=1; a*=2; }
。
此外,使用match
匹配时必须确保能完全匹配该类型的所有可能(比如匹配对象为i32时,必须确保数据范围内所有可能值都能被匹配到),否则无法编译
因此如果不使用通配符,就必须这么写:
1 | let mut a = 1; |
match
语句允许存在重复的匹配语句,进行match
匹配时,match
会从上到下判断是否匹配,如果匹配到语句后,下面的语句将不再进行匹配判断,例子:
1 | match 1 { |
输出:
1 | 匹配到了第一个语句 |
使用Range
进行值匹配
上文中,我提到一个区间类型(std::ops::Range
),Rust中可以使用Range
进行值匹配:
1 | match 1 { |
输出:
1 | 匹配到了第一个语句 |
绑定语法
TODO
条件匹配
如果需要更为精细的匹配,可以使用guard
语句(卫语句,其实就是match
+if
):
1 | match 1 { |