制御フロー
プログラムの流れを制御する「条件分岐」と「繰り返し」について学びます。
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..5 で i が取る値は?
正解: B)
1..5 は1から始まり、5を含みません(5未満)。5を含めたい場合は 1..=5 を使います。
Q2. continue の動作として正しいのは?
正解: B)
continue は現在の繰り返しの残りの処理をスキップし、次の繰り返しに進みます。break はループを完全に終了します。
Q3. 以下のコードの出力は?let mut sum = 0; for i in 1..=3 { sum += i; } println!("{}", sum);
正解: C)
1..=3 は1, 2, 3を含むので、合計は 1 + 2 + 3 = 6 です。
Q4. if number { ... } でnumberがi32型の場合、どう修正すべき?
正解: D) Rustでは
if の条件は必ず bool 型でなければなりません。比較演算子を使って明示的にbool値を作成します。
Q5. 3の倍数を判定する条件式として正しいのは?
正解: B) 剰余演算子
% を使って、3で割った余りが0かどうかを判定します。余りが0なら3の倍数です。
次のドキュメント: 04_functions.md