🌊

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

2021/03/26に公開

制御フロー

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

if文

例:

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式を使うこともできます。

例:

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で抜ける必要があります。)

例:

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で条件付きループの実装を行うこともできます。

例:

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文では、イテレータとして評価される式を反復処理します。
  • イテレータとは、項目がなくなるまで次の項目を探ることができるオブジェクトです。
  • .. 演算子は、開始から終了の手前までの数値を生成するイテレータを作成できます。
  • ..= 演算子は、開始から終了までの数値を生成するイテレータを作成します。

例:

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を使って配列コレクションの各アイテムに対してコードを実行することもできます。

例:

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メソッドを使用すると範囲を逆順にしたカウントダウンとかもできます。

例:

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では、すべてのケースを処理しなければなりません。
  • そのため、どのパターンにもマッチしない場合のデフォルトマッチが必須です。(_ =>)

例:

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

参考文献

Discussion