循环,第一部分:while (Loops, part 1)

你之前对 factorial 的实现被迫使用了递归 (recursion)。
如果你来自函数式编程 (functional programming) 背景,这可能让你感觉很自然。 但如果你习惯了 C 或 Python 这类更偏命令式 (imperative) 的语言,可能会觉得有些奇怪。

让我们看看如何用循环 (loop) 来实现相同的功能。

while 循环

while 循环是一种只要条件 (condition) 为真就持续执行代码块的方式。
通用语法如下:

while <condition> {
    // 要执行的代码
}

例如,我们可能想要对 1 到 5 之间的数字求和:

let sum = 0;
let i = 1;
// "当 i 小于或等于 5 时"
while i <= 5 {
    // `+=` 是 `sum = sum + i` 的简写
    sum += i;
    i += 1;
}

这段代码会不断地给 i 加 1,并把 i 加到 sum 上,直到 i 不再小于或等于 5。

mut 关键字

上面的例子按原样是无法编译的。你会得到类似这样的错误:

error[E0384]: cannot assign twice to immutable variable `sum`
 --> src/main.rs:7:9
  |
2 |     let sum = 0;
  |         ---
  |         |
  |         first assignment to `sum`
  |         help: consider making this binding mutable: `mut sum`
...
7 |         sum += i;
  |         ^^^^^^^^ cannot assign twice to immutable variable

error[E0384]: cannot assign twice to immutable variable `i`
 --> src/main.rs:8:9
  |
3 |     let i = 1;
  |         -
  |         |
  |         first assignment to `i`
  |         help: consider making this binding mutable: `mut i`
...
8 |         i += 1;
  |         ^^^^^^ cannot assign twice to immutable variable

这是因为 Rust 中的变量默认是不可变的 (immutable)
一旦赋值后,你就不能再改变它们的值。

如果你希望允许修改,必须使用 mut 关键字将变量声明为可变的 (mutable)

// `sum` 和 `i` 现在是可变的了!
let mut sum = 0;
let mut i = 1;

while i <= 5 {
    sum += i;
    i += 1;
}

这样就可以正常编译并运行了。

进一步阅读

原文链接:英文原文