RUST学习日记之控制流
if表达式
rust中的if语句跟C语言中的是类似的,基本格式如下
1 | fn main() { |
但也有不同的地方:
- if后紧跟的条件必须是一个bool值,如果不是的话,程序会无法编译
- 在rust中,if是一个表达式而不是语句,二者之间的区别就是语句仅仅只是执行一个动作而不返回值,表达式会在执行后返回一个值。
1 | fn main() { |
关键点:
返回类型一致性:当
if作为表达式使用时,所有分支(if、else if和else)必须返回相同类型的值。1
2
3
4
5let result = if true {
10 // 返回 i32
} else {
"hello" // 错误!返回 &str,类型不匹配
};编译器会报错,因为
10是整数,而"hello"是字符串切片,它们的类型不同。块的最后一个表达式是返回值:在 Rust 中,一个代码块的值是其最后一个表达式的值(没有分号),没法使用return ***;的形式返回。
1
2
3
4
5
6let value = if condition {
let temp = 10;
temp + 5 // 这个表达式的值 15 就是整个 if 分支的返回值
} else {
20
};
循环
rust中的循环分3种:
- loop
- while
- for
需要注意的是,rust中是没有类似于C语言中do while()这种循环结构的,等效的功能可以由loop实现。
loop:
loop循环类似于C语言中while(1)或者for(;;),不手动用Break退出的话就会一直循环下去。
1 | fn main() { |
需要注意的是,rust中有一个C语言中没有的特性:循环标签
循环标签(loop labels):
语法:
1 | 'label_name: loop { |
循环标签的语法是在 loop、while 或 for 关键字之前加上一个单引号开头的名称,后面紧跟着一个冒号,然后在使用 break 或 continue 时指定这个标签,从而控制跳出或继续执行哪个具体的循环,即使它不是最内层循环。
1 | fn main() { |
rust的这种特性很好的避免了C语言中需要跳出复杂循环时需要设置标志位以及单独判断的情况。
1 | int done = 0; |
while:
1 | fn main(){ |
while循环的语法跟特性与C语言都是类似的,唯一的不同就是它的条件必须是一个bool量而不能是其他类型。
for:
Rust的for循环与C语言的for循环有较大不同,Rust中的for循环类似于其他现代语言中的”for each”。
核心差异总结
| 特性 | C 语言的 for 循环 |
Rust 的 for 循环 |
|---|---|---|
| 基础 | 基于计数器和条件,手动控制迭代过程 | 基于迭代器,遍历集合中的每个元素 |
| 语法 | for (init; condition; step) |
for element in iterator |
| 安全性 | 容易出现索引越界和“差一错误”,需要手动管理 | Rust 的所有权和借用系统保证安全,避免越界访问 |
| 简洁性 | 对于简单计数循环简洁,但遍历集合时需要额外索引管理 | 遍历集合和范围时非常简洁,不需要手动索引或长度计算 |
| 灵活性 | 可以实现任何循环逻辑,包括非标准迭代(但可能不清晰) | 通过迭代器适配器(map, filter 等)实现复杂迭代逻辑 |
| 返回值 | 循环本身不返回值 | 循环本身不返回值,但可以结合 break 来返回值 |
语法如下:
1 | for 元素 in 迭代器 { |
下面是简单的示例:
1 | fn main() { |
注意:Rust是可以通过break;在循环(for while loop)中返回值的,例子如下:
1 | fn main() { |