Rust(18):循环表达式

486 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

今天学习的内容是 Rust 中的另一种流程控制逻辑,循环表达式。

流程控制包括分支和循环。Rust 提供了三种循环表达式:

  • loop
  • while
  • for

loop 循环

Rust 中使用关键字loop 表示无限循环,除非使用 break 或者 continue 关键字来手动结束循环。

break 表示终止循环,continue 表示停止本次循环,开始执行下一次循环。

如下,是一个计算 1+2+3+...+100 的值的算法,使用了 loop 循环,当加数达到100后使用 break 结束循环:

fn main() {
    let mut sum = 0;
    let mut n = 0;
    loop {
        sum += n;
        n += 1;
        if n > 100 {
            break;
        }
    }
    println!("{}", sum)
}

代码执行,打印出 5050。

前文说过,Rust 中的循环也是表达式,那么就会有值的产生。在 loop 循环中,使用 break 结束循环,并在 break 后面跟上一个值,这个值就是 loop 表达式的值。

如下,从 0 开始计数,当 counter 等于 10 时,结束循环,并将 counter 的值乘以 2,赋值给变量 result

fn main() {
    let mut counter = 0;
    let result = loop {
        counter += 1;
        if counter == 10 {
            break counter * 2;
        }
    }; // 这里要加上分号
    
    println!("{}", result);
}

while 循环

while 循环是最常见的循环之一。每次开始循环之前先要判断一些 while 的条件,如果条件为真,则执行循环,否则就停止循环。

如下,当变量 num 大于0时执行循环体内的逻辑:

fn main() {
    let mut num = 3;
    while num > 0 {
        println!("{}", num);
        num = num - 1;
    }
    println!("结束循环");
}

for 循环

for 循环应该是使用最多的一种循环了。

在其他语言中,我们常用 for 循环来遍历数组。在Rust 中的 for 循环用来遍历一个迭代器。

创建迭代器有多种方法,最常用的是使用这两种:

  • a..b:创建一个包含 a 但不包含 b,步长为1的迭代器
  • a..=b:创建一个包含 a 且包含 b,步长为1的迭代器

示例:

fn main() {
    for i in 0..5 {
        println!("{}", i);
    }
    
    for i in 0..=5 {
        println!("{}", i);
    }
}

第一个 for 循环打印出 0,1,2,3,4,第二个 for 循环打印出 0,1,2,3,4,5。

for

Rust 中遍历数组,需要先将数组转为遍历器,使用数组的关联方法 iter 或者 iter_mut,区别是后者是可变的。

fn main() {
    let mut arr = [1, 2, 3];
    for i in arr.iter() {
        println!("{}", i);
    }
    
    for i in arr.iter_mut() {
        *i *= 2;
    }
     println!("{:?}", arr);
}

第一个 for 循环,将数组转为迭代器,然后进行遍历,打印出数组中元素,分别是 1,2,3。

第二个 for 循环,将数组转为了可变迭代器,然后修改了元素中的元素,每个元素变为了原来的两倍,所以打印的结果是 [2, 4, 6]。

小结

本文介绍了 Rust 中的循环表达式,包括 loopwhilefor 循环。loop 循环一般用的比较少,可以用来试错。当结果正确时,使用 break 将结果返回。whilefor 循环是使用最多的。大部分时候都会使用 for 循环。