侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

Rust-N04:控制流

barwe
2024-10-05 / 0 评论 / 0 点赞 / 151 阅读 / 1,338 字
温馨提示:
本文最后更新于 2024-10-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

控制流

条件

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 循环(避免使用索引访问)。

0

评论区