Rustでの基本制御フローを実装してみよう!

# 制御フロー
* Rustでは、次の論理演算子は使えます。(==, !=, <, >, <=, >=, !, ||, &&)
* 下記にif文の実装をしてみます。

## if文

例:

```rust
fn main() {
    let x = 12;
    if x < 12 {
        println!("12 より小さい");
    } else if x == 12 {
        println!("12 に等しい");
    } else {
        println!("12 より大きい");
    }
}
```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.82s
     Running `target/debug/variables`
12 に等しい
```
### let文内でif

* let文内でif式を使うこともできます。

例:

```rust
fn main() {
    let condition = true;
    let number = if condition {
        1
    } else {
        2
    };

    println!("value : {}", number);
}
```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.67s
     Running `target/debug/variables`
value : 1
```

##loop

* ループでの繰り返しは、loopで行わせられます。(無限ループになるので、breakで抜ける必要があります。)

例:

```rust
fn main() {
    let mut x = 0;
    loop {
        x += 1;
        if x == 13 {
            break;
        }
    }
    println!("{}", x);
}

```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.21s
     Running `target/debug/variables`
13
```

##
## while

* whileで条件付きループの実装を行うこともできます。

例：

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

    while x != 32 {
        x += 1;
    }
    println!("{}", x);
}

```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.76s
     Running `target/debug/variables`
32
```
## for文

* forの実装も行うことができます。
* rustのfor文では、**イテレータ**として評価される式を反復処理します。
* **イテレータ**とは、項目がなくなるまで次の項目を探ることができるオブジェクトです。
* **.. 演算子**は、開始から終了の**手前まで**の数値を生成するイテレータを作成できます。
* **..= 演算子**は、開始から終了**までの**数値を生成するイテレータを作成します。

例:

```rust
fn main() {
    for x in 0..10 {
        println!("{}", x);
    }
}
```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.24s
     Running `target/debug/variables`
0
1
2
3
4
5
6
7
8
9
```
### 配列に対するコード実行

* forを使って配列コレクションの各アイテムに対してコードを実行することもできます。

例:

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

    for element in a.iter() {
        println!("value: {}", element);
    }
}

```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.39s
     Running `target/debug/variables`
value: 10
value: 20
value: 30
value: 40
value: 50
```
### revメソッド

* forと、revメソッドを使用すると範囲を逆順にしたカウントダウンとかもできます。

例:

```rust
fn main() {
    for number in (1..=5).rev() {
        println!("{}", number);
    }
}
```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.22s
     Running `target/debug/variables`
5
4
3
2
1
```
## match
* Rustでswitchを表現したい場合には、matchを使うといいです。
* matchは、値が取り得るすべての条件にマッチさせて、マッチが真であればコードを実行するようなことができます。
* matchでは、すべてのケースを処理しなければなりません。
* そのため、どのパターンにもマッチしない場合のデフォルトマッチが必須です。(_ =>)

例: 

```rust
fn main() {
    let x = 30;

    match x {
        0 => {
            println!("0を見つけました。");
        }
        1 | 2 => {
            println!("1か2を見つけました。");
        }
        3..=9 => {
            println!("3~9の範囲内であることを見つけました。");
        }

        matched_num @ 10..=100 => {
            println!("10~100の間でその数値は: {}", matched_num);
        }
        _ => {
            println!("その他");
        }
    }
}
```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.21s
     Running `target/debug/variables`
10~100の間でその数値は: 30
```

# 参考文献
* [THE BOOK 3章](https://doc.rust-lang.org/book/)
* [Tour of Rust](https://tourofrust.com/)