当前位置:嗨网首页>书籍在线阅读

13-循环

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

1.3.8 循环

在Rust中重复做某些事情可以使用3种构造来完成,即loop、while和for。在所有这些构造中,通常都包含关键字continue和break,分别允许你跳过和跳出循环。以下是一个使用循环的示例,相当于C语言中的while(true):

// loops.rs
fn main() {
    let mut x = 1024;
    loop {
        if x < 0 {
            break;
        }
        println!("{} more runs to go", x);
        x -= 1;
    }
}

loop表示无限循环。在上述代码中,我们简单地递减x的值,当它达到if条件x<0时,中断循环。在Rust中执行循环的一个额外特性是,能够使用名称标记循环代码块。这可以在你有两个或多个嵌套循环,并想要从它们中的任何一个中断的情况下使用,而不仅针对直接包含break语句的循环。以下是使用循环标签中断loop的示例:

// loop_labels.rs
fn silly_sub(a: i32, b: i32) -> i32 {
    let mut result = 0;
    'increment: loop {
        if result == a {
            let mut dec = b;
            'decrement: loop {
                if dec == 0 {
                    //直接从 'increment循环中断
                    break 'increment;
                } else {
                    result -= 1;
                    dec -= 1;
                }
            }
        } else {
            result += 1;
        }
    }
    result
}
fn main() {
    let a = 10;
    let b = 4;
    let result = silly_sub(a, b);
    println!("{} minus {} is {}", a, b, result);
}

在上述代码中,我们正在执行一种非常低效的减法操作,只是为了演示标签在嵌套循环中的使用方法。在内部'decrement标签中,当dec等于0时,可以传递一个标签来中断循环(这里是'increment),并且中断外部的'increment循环。

现在,让我们看看while循环。这个示例非常简单:

// while.rs
fn main() {
    let mut x = 1000;
    while x > 0 {
        println!("{} more runs to go", x);
        x -= 1;
    }
}

Rust中也有关键字for,它类似于其他语言中使用的for循环,但它们的实现完全不同。Rust的for循环基本上是一种更强大的重复构造(迭代器)的语法糖。我们将在第7章详细地讨论它。简单地说,Rust中的for循环只适用于可以转换为迭代器的类型。一种这样的类型是Range类型。Range类型可以指代一系列数字,例如(0..10)。它们可以用于for循环,如下所示:

// for_loops.rs
fn main() {
    //不包括10
    print!("Normal ranges: ");
    for i in 0..10 {
        print!("{},", i);
    }
    println!();       //另起一行
    print!("Inclusive ranges: ");
    //开始计数直到10
    for i in 0..=10 {
        print!("{},", i);
    }
}

一般的区间语法0..10,是不包括10的,Rust还具有包含区间的语法,例如0..=10,它会一直迭代到10才停止,如第2个for循环所示。现在,我们将开始讨论自定义数据类型。