在 Rust 中,loop 关键字用于创建一个无限循环,直到显式地使用 break 语句退出。与其他语言的循环不同,Rust 的 loop 可以返回值,这使得它在处理重复任务时非常灵活。

基本语法

loop循环的语法非常简单:

loop { 
    /* 代码块 */ 
}

它会一直执行循环体内的代码,除非你显示的使用了break关键字跳出循环。

fn main() {
    loop {
        println!("hello world!");
    }
}

这段代码将无限循环的打印hello world,直到你按下Ctrl + C终止程序运行;

使用 break 和 continue 控制循环

loop 循环中,break 用于立即退出循环,而 continue 用于跳过当前迭代的剩余部分,直接进入下一次迭代。

fn main() {
    let mut num = 0;
    loop {
        num += 1;
        if num % 2 == 0 {
            continue; // 跳过偶数
        }
        println!("奇数: {}", num);
        if num >= 7 {
            break; // 当 num 达到 7 时退出循环
        }
    }
}

程序输出

奇数: 1
奇数: 3
奇数: 5
奇数: 7

loop 的返回值

Rust 的 loop 循环可以返回一个值,这是通过 break 语句后跟一个表达式实现的。返回值会被赋给循环外部的变量。这在需要从循环中提取结果时非常有用。

例如,反复验证用户的输入,直到输入了一个合法的数字:

fn main() {
    let number: i32 = loop {
        let mut input = String::new();
        println!("请输入一个整数:");

        std::io::stdin()
            .read_line(&mut input)
            .expect("读取输入失败");
        
        let input = input.trim();
        let parsed = input.parse();
        
        if parsed.is_ok(){
            break parsed.unwrap(); // 返回数字
        }
        
        println!("你输入的 '{}' 不是一个整数",input);
        
    };
    
    println!("你输入了一个数字:{}", number);
}

程序运行效果

请输入一个整数:
abc
你输入的 'abc' 不是一个整数
请输入一个整数:
3.14
你输入的 '3.14' 不是一个整数
请输入一个整数:
123
你输入了一个数字:123

loop 循环标签

循环标签用于嵌套循环中精确控制跳出哪个循环,避免只能跳出最内层循环的限制。

'标签名: loop {
    // ...
    break '标签名;  // 跳出指定的循环
    continue '标签名;  // 跳到外层循环的下一次迭代
}

有返回值的用法:

break '标签名 返回值;

跳出外层循环的示例:

'outer: loop {
    println!("外层循环开始");
    
    loop {
        println!("  内层循环");
        break 'outer;  // 直接跳出外层循环
    }
    
    println!("这行永远不会执行");
}