循环,第一部分:while

你的阶乘实现被迫采用了递归方法。

如果你来自函数式编程背景,这对你来说可能感觉很自然。或者,如果你习惯了C或Python这样的命令式语言,这可能会觉得有些奇怪。

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

while 循环

while``循环是一种在条件为真时执行代码块的方法。

一般语法如下:

#![allow(unused)]
fn main() {
while <condition> {
    // code to execute
}
}

例如,我们可能想计算1到5的数字之和:

#![allow(unused)]
fn main() {
let sum = 0;
let i = 1;
// "while i is less than or equal to 5"
while i <= 5 {
    // `+=` is a shorthand for `sum = sum + i`
    sum += i;
    i += 1;
}
}

这会持续将1加到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中的变量默认是不可变的。

一旦赋值后,就不能改变其值。

如果你想允许修改,就需要使用mut关键字声明变量为可变:

#![allow(unused)]
fn main() {
// `sum` and `i` are mutable now!
let mut sum = 0;
let mut i = 1;

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

这样就能正常编译和运行了。

参考资料

本节练习位于 exercises/02_basic_calculator/06_while

进一步阅读

关于while循环的文档