Control Flows¶
本节介绍Rust中的函数和控制流语句。
函数与函数指针¶
Rust中,用关键字fn
声明函数,函数的格式为:
fn <function name>([<parameter name>: <parameter type>, ...]) -> [<return type>] {
<function body>
}
其中,函数必须指明所有参数的类型。如果没有指明函数的返回类型,则默认为()
,即空元组。函数可以通过return
关键字返回值,也可以通过最后一行的表达式返回值。任何情况下,如果通过表达式返回值,则不能加分号;
。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
函数指针的类型为fn(<parameter type>, ...) -> <return type>
,将函数赋值给函数指针时,参数列表和返回值类型必须全部匹配。
在函数内部也可以声明函数,称为lambda函数,声明方式为
let <function name> = |[<parameter name>: <parameter type>, ...]| -> [<return type>] {
<function body>
}
其中:
-
参数列表可以省略类型。
let add = |a, b| { return a + b; };
-
如果函数体只有一行,可以省略
{}
,此时不能加返回值类型。let add = |a, b| a + b;
-
可以在声明的时候直接调用,此时不能省略
{}
和返回值类型。let result = |a, b| -> i32 { a + b }(1, 2); // result = 3
1 2 3 4 5 6 |
|
if
语句¶
Rust中if
语句的格式与C/C++相似,但是条件表达式不需要加括号。
if <condition> {
<expression>
} [ else if <condition> {
<expression>
} ] [ else {
<expression>
} ]
if
语句也可以用在表达式中,此时每个分支块的最后一行作为该分支的返回值。此时每个分支的返回值类型必须相同。
1 2 3 4 5 6 7 8 9 |
|
match
语句¶
match
语句用于对变量的值进行模式匹配,格式为:
match <variable> {
<pattern> => <expression>,
...
_ => <expression>
}
其中,<pattern>
可以是
- 单个数值,如
5 => "five"
- 范围,如
1 ..= 5 => "one to five"
|
分隔的多个模式,如1 | 2 | 3 => "one to three"
- 模板实例,如
Some(x) => Some(x + 1)
_
,表示匹配所有情况。- 如果被匹配的变量是元组,则元组的每个元素都可以是上述模式。
- 条件语句,如
x if x > 5 => "greater than five"
,此时元组是一个整体参与条件语句,如(x, y) if x > 5 && y > 5 => "both greater than five"
<expression>
可以是返回值,也可以是代码块,此时代码块的最后一行作为返回值。
注意match
的分支必须包括所有可能的情况,否则会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
if let
语句¶
和match
类似,if let
语句用于匹配单个模式,格式为:
if let <pattern> = <variable> {
<expression>
}
let <pattern> = <variable>
可以看成一个条件(但实际并不是),如果能匹配则将<variable>
的值按照<pattern>
进行绑定,并返回true
,因此也会有while let
等其他语句。
loop
语句¶
loop
语句用于无限循环。
- 可以用
continue
跳转到下一次循环,或break
跳出循环。 loop
可以用break <expression>
返回值,此时所有break
的返回值类型必须相同。- 每个循环可以用
'<label>: loop
标记,在break
和continue
时可以指定跳出/跳过的循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
while
语句¶
while
语句用于是有条件的循环,while
语句不能返回值,其他与loop
语句相同。
while <condition> {
<expression>
}
for
语句¶
for
语句用于遍历迭代器,格式为:
for <variable> in <iterator> {
<expression>
}
其中,<iterator>
可以是
start .. end
,表示从start
到end - 1
的整数范围。start ..= end
,表示从start
到end
的整数范围。- 由方法
<iterable>.iter()
返回的迭代器,如[1, 2, 3].iter()
。
for
循环也可以添加标签。
1 2 3 4 5 6 7 8 9 10 11 |
|
严格意义上for
语句不能直接遍历容器对象,需要用iter()
方法返回迭代器。但for
会尝试隐式调用,因此下面的代码也能正常执行。
fn main() {
let a = [1, 2, 3];
for i in a {
println!("{}", i);
}
}