# 3.5 控制流

Rust中的控制流结构主要包括：

- `if`条件判断；
- `loop`循环；
- `while`循环；
- `for .. in` 循环。

## 3.5.1 if条件判断

- `if`执行条件判断，示例如下：

    ```rust
    fn main() {
        let a = 2u32;

        if a > 5u32 {
            println!("a > 5");
        } else {
            println!("a <= 5");
        }
    }
    ```

- `if - else if`处理多重条件，示例如下：

    ```rust
    fn main() {
        let a = 3u32;

        if a > 5u32 {
            println!("a > 5");
        } else if a > 4u32 {
            println!("a > 4");
        } else if a > 3u32 {
            println!("a > 3");
        } else if a > 2u32 {
            println!("a > 2");
        } else if a > 1u32 {
            println!("a > 1");
        } else {
            println!("a = 1");
        }
    }
    ```

- 在`let`语句中使用`if`

   `if`是一个表达式，所以可以在`let`右侧使用，如下：

    ```rust
    fn main() {
        let a = 3u32;

        let a_bigger_than_two: bool = if a > 2u32 {
            true
        } else {
            false
        };

        if a_bigger_than_two {
            println!("a > 2");
        } else {
            println!("a <= 2");
        }
    }
    ```

## 3.5.2 loop循环

- loop重复执行代码

    ```rust
    fn main() {
        // 一直循环打印 again!
        loop {
            println!("again!");
        }
    }
    ```

- 使用`break`终止循环

    ```rust
    fn main() {
        let mut counter = 0;

        loop {
            println!("counter = {:?}", counter);
            counter += 1;

            if counter == 10 {
                break; // 将终止循环
            }
        }
    }
    ```

    上面的代码将打印10次，遇到`break`后终止循环。另外，`break`也可以返回值，如下：

    ```rust
    fn main() {
        let mut counter = 0;

        let result = loop {
            counter += 1;

            if counter == 10 {
                break counter * 2;
            }
        };

        println!("The result is {result}");
    }
    ```

- 使用`continue`可以直接跳到下一轮循环

    ```rust
    fn main() {
        let mut x = 0;
        // 此循环将只打印10以内的奇数
        loop {
            x += 1;
            if x == 10 {
                break;
            }
            if x % 2 == 0 {
                continue; // 将直接跳到下一轮循环
            }
            println!("{}", x);
        }
    }
    ```

## 3.5.3 while条件循环

- `while`条件循环执行代码，当条件不满足时结束循环，如下：

    ```rust
    fn main() {
        let mut cnt = 0u32;
        while cnt < 10 {
            println!("cnt = {:?}", cnt);
            cnt += 1;
        }
    }
    ```

- 在`while`循环中也可以使用`break`和`continue`，如下：

    ```rust
    fn main() {
        let mut x = 0;

        while x < 10 {
            x += 1;
            println!("{}", x);
            if x % 2 == 0 {
                continue; // 跳到下一轮循环
            }
            if x > 8 {
                break; // 提前结束
            }
        }
    }
    ```

## 3.5.4 `for .. in` 循环

`for`循环用来对一个集合的每个元素执行一些代码，使用方式如下：

```rust
fn main() {
    let a = [10, 20, 30, 40, 50];

    for item in a {
        println!("the value is: {:?}", item);
    }
}
```
