控制流
条件
fn main() {
let number = 6;
if number % 4 == 0 {
println!("number is divisible by 4");
} else if number % 3 == 0 {
println!("number is divisible by 3");
} else if number % 2 == 0 {
println!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3, or 2");
}
}
- 作为条件的表达式的值只能是
bool
类型,Rust 不会自动转换 - 条件分支过多时应该考虑使用
match
重构
if {} else if {} else {}
这一大坨本身就是一个 表达式,它可以直接用于等号右边,给等号左边赋值(这里体现了 Rust 基于表达式的特性)
let x = if true { 1 } else { 2 };
注意:上述作为表达式的写法能通过编译的前提是,各个分支表达式的返回值类型一致,否则编译会出错。
// 下面这个 if 表达式是无效的
let x = if true { 1 } else { "tom" };
循环
Rust 实现循环的三种方式:loop
, while
, for
。循环整体可以作为一个表达式使用。
break 表达式
与其他语言一样,continue
用来跳过当前循环剩余逻辑,直接开始下一个循环。
break
可以用来跳出循环,也可以作为表达式返回一个值,这个值也是循环整体表达式的计算值:
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 20 {
break counter * 2;
}
};
println!("reslut={result}");
}
- break 返回表达式时,loop 表达式必须放在等号左边,否则返回的值没有被接收,这是 Rust 不允许的
嵌套循环跨层返回
fn main() {
let mut i = 0;
'outer: loop {
i += 1;
let mut j = 0;
loop {
j = j + i * 2;
if j > 10 {
println!("i={i}, j={j}");
break 'outer;
}
}
}
}
- 命名的外层循环(
'outer: loop {}
)+ break 直接跳出指定循环(break 'outer;
) - 循环的标签名称格式为
'标签名称
,必须以一个单引号开头 - 如果跳出外层循环的同时返回表达式,可以这样:
break 'outer j;
,同理返回表达式时,外层 loop 表达式的值需要有变量接收
while
fn main() {
let mut i = 0;
while i < 10 {
i += 1;
}
println!("over");
}
while cond {}
不是表达式,它结尾不需要加分号(加了也会被 rustfmt 去掉,这里的 {}
功能应该跟函数的差不多,仅用来限制作用域)。
for
for .. in ...
用来遍历集合的元素。
fn main() {
for i in (1..4).rev() {
println!("i={i}");
}
}
循环次数能在编译时确定的,尽量使用 for 循环(避免使用索引访问)。
评论区