Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

制御フロー

プログラムの流れを制御する「条件分岐」と「繰り返し」について学びます。

if式(条件分岐)

条件によって処理を分けます。

基本形

fn main() {
    let age = 20;

    if age >= 18 {
        println!("成人です");
    }
}

if-else

fn main() {
    let age = 15;

    if age >= 18 {
        println!("成人です");
    } else {
        println!("未成年です");
    }
}

if-else if-else

fn main() {
    let score = 75;

    if score >= 90 {
        println!("優");
    } else if score >= 70 {
        println!("良");
    } else if score >= 50 {
        println!("可");
    } else {
        println!("不可");
    }
}

条件は必ずbool型

fn main() {
    let number = 3;

    // if number {  // エラー!numberはi32でboolではない
    if number != 0 {  // OK
        println!("ゼロではない");
    }
}

他の言語(JavaScript、Pythonなど)では if number が動くこともありますが、Rustでは必ず bool 型が必要です。

ifは「式」である

Rustでは if は値を返す「式」です。

fn main() {
    let condition = true;
    let number = if condition { 5 } else { 6 };
    println!("number = {}", number);  // 5
}

注意: 両方のブロックが同じ型を返す必要があります。

#![allow(unused)]
fn main() {
// エラー!型が違う
// let number = if condition { 5 } else { "six" };
}

loop(無限ループ)

loop は明示的に止めるまで繰り返します。

fn main() {
    let mut count = 0;

    loop {
        count += 1;
        println!("カウント: {}", count);

        if count >= 5 {
            break;  // ループを抜ける
        }
    }
}

breakで値を返す

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;  // 20を返す
        }
    };

    println!("結果: {}", result);  // 20
}

while(条件付きループ)

条件が true の間、繰り返します。

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{}!", number);
        number -= 1;
    }

    println!("発射!");
}

出力:

3!
2!
1!
発射!

for(範囲ループ)

最もよく使うループです。

範囲を使った繰り返し

fn main() {
    // 1から4まで(5は含まない)
    for i in 1..5 {
        println!("{}", i);
    }
}

出力:

1
2
3
4

範囲の種類

fn main() {
    // 1..5  : 1, 2, 3, 4(5を含まない)
    for i in 1..5 {
        print!("{} ", i);
    }
    println!();

    // 1..=5 : 1, 2, 3, 4, 5(5を含む)
    for i in 1..=5 {
        print!("{} ", i);
    }
    println!();
}

配列の繰り返し

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

    for n in numbers {
        println!("{}", n);
    }
}

インデックス付きで繰り返し

fn main() {
    let fruits = ["りんご", "みかん", "バナナ"];

    for (index, fruit) in fruits.iter().enumerate() {
        println!("{}: {}", index, fruit);
    }
}

出力:

0: りんご
1: みかん
2: バナナ

breakとcontinue

break(ループを抜ける)

fn main() {
    for i in 1..10 {
        if i == 5 {
            break;  // ループ終了
        }
        println!("{}", i);
    }
}

出力:

1
2
3
4

continue(次の繰り返しへ)

fn main() {
    for i in 1..10 {
        if i % 2 == 0 {
            continue;  // 偶数はスキップ
        }
        println!("{}", i);
    }
}

出力:

1
3
5
7
9

match(パターンマッチング)

複数の条件を整理して書けます。

fn main() {
    let number = 3;

    match number {
        1 => println!("一"),
        2 => println!("二"),
        3 => println!("三"),
        _ => println!("その他"),  // _ はそれ以外すべて
    }
}

複数の値をまとめる

fn main() {
    let number = 5;

    match number {
        1 | 2 | 3 => println!("小さい"),  // 1, 2, 3のどれか
        4..=6 => println!("中くらい"),     // 4〜6の範囲
        _ => println!("大きい"),
    }
}

matchは式

fn main() {
    let number = 3;

    let description = match number {
        1 => "一つ",
        2 => "二つ",
        _ => "たくさん",
    };

    println!("{}", description);
}

まとめ

構文用途
if条件分岐
loop無限ループ(breakで終了)
while条件が真の間ループ
for範囲や配列を繰り返し
matchパターンマッチング
breakループを抜ける
continue次の繰り返しへスキップ

確認テスト

Q1. for i in 1..5i が取る値は?

Q2. continue の動作として正しいのは?

Q3. 以下のコードの出力は?
let mut sum = 0; for i in 1..=3 { sum += i; } println!("{}", sum);

Q4. if number { ... } でnumberがi32型の場合、どう修正すべき?

Q5. 3の倍数を判定する条件式として正しいのは?


次のドキュメント: 04_functions.md