跳转到内容

Rust 新手程序员/循环和迭代

100% developed
来自 Wikibooks,开放世界中的开放书籍

循环和迭代

[编辑 | 编辑源代码]

假设我们想遍历从 1 到 100 的所有数字,并打印出所有能被 6 整除的数字。我们该如何实现?我们可以编写一个函数来检查一个数字是否能被 6 整除,我们先来做这个。通过将我们需要做的事情分开,我们可以一步一步地解决问题,这使我们更容易理解。所以首先让我们编写函数的框架

 fn is_divisible_six(input: i32) -> bool {
     //to do
 }

我们在这里使用注释来表明我们将填充函数内部的内容。目前,这无法编译,因为函数**必须**返回一个布尔值,即 true 或 false,而目前它什么也不返回。
我们如何检查一个数字是否能被 6 整除?快速复习一下,能被 6 整除意味着如果它除以 6,结果将是一个整数。但是,输入类型是 i32,所以除以 6 将始终返回一个整数,因为它是进行整数除法。那么我们该如何继续?一种方法是不断地从数字中减去 6,直到我们得到一个小于 6 的数字。如果这个数字是 0,就意味着该数字能被 6 整除,如果不是,则不能。然后问题是,如何用代码表达这种“不断地” “直到” 的逻辑。答案是 while 循环。只要布尔值(称为条件)为 true,while 循环就会不断地运行 {} 括号中的内容。

 fn is_divisible_six(input: i32) -> bool {
     let mut number = input;
     while number >= 6 {
         number -= 6;
     }
     if number == 0 {
          return true;
     } else {
          return false;
     }
 }

这是前面步骤的直接代码转换。请注意,我们可以写成 6 < number,这与之前是一样的,但按照惯例,我们通常将变量放在条件左侧,因为这样更自然地阅读和理解。
我们在这里做的是找出输入的余数。这是一种非常常见的事情,所以有一个内置的方法来做到这一点,使用百分号 %。所以 a % b 获取 a 除以 b 的余数。因此,用这种方式编写函数要简单得多

 fn is_divisible_six(input: i32) -> bool {
     let remainder = input % 6;
     if remainder == 0 {
          return true;
     } else {
          return false;
     }
 }

我们可以进一步简化,因为 remainder == 0 本身就是一个布尔值,与我们想要返回的值相对应,所以我们可以这样做

 fn is_divisible_six(input: i32) -> bool {
     let remainder = input % 6;
     return remainder == 0;
 }

这好多了。余数运算符的寓意是,如果你正在做一些非常常见的事情,可能有一种简单的方法可以实现,而找到这些方法的最佳方式通常是搜索。

回到最初的事情,即遍历从 1 到 100 的所有数字,并打印出所有能被 6 整除的数字。现在我们可以使用 while 循环来做到这一点,我们只需要将一个数字设置为 1,然后在数字小于或等于 100 的情况下继续循环。

 fn main() {
     let mut number = 1;
     while number <= 100 {
          if is_divisible_six(number) {
              println!("{}", number);
          }
     }
 }

这可以工作,但有一种内置的简单方法可以迭代数字。这些被称为 for 循环,我们将在下面重新编写上面的代码

 fn main() {
     for number in 1..101 {
         if is_divisible_six(number) {
             println!("{}", number);
         }
     }
 }

这与上面的 while 循环具有相同的结果,但更简洁。1..101 被称为一个范围,它从 1 到 100。它在右侧必须是 101 的原因是它是非包含性的,意味着它不包括最后一个数字。原因将在后面看到。我们可以使用包含性的范围 ..=,所以 1..=100 将产生相同的结果。'for number in' 表示一个名为 number 的变量,它在 for 循环遍历范围中的值时存储该值。for 循环可以遍历任何是“迭代器”的东西,这将在后面解释。

下一个:数组和向量

华夏公益教科书