制御構造は、「どの処理を、どの順番で、何回実行するか」を決めます。


3.1 順次実行

基本的には上から順番に実行されます。

処理A
処理B
処理C

3.2 条件分岐

if score >= 80:
    result = "pass"
else:
    result = "fail"

ほぼすべての言語にif相当の構文があります。

比較すべき点は、ifが「文」なのか「式」なのかです。

文としてのif

値を直接返しません。

let result;

if (score >= 80) {
  result = "pass";
} else {
  result = "fail";
}

式としてのif

条件分岐全体が値になります。

let result = if score >= 80 {
    "pass"
} else {
    "fail"
};

式指向の言語では、中間的な可変変数を減らせます。


3.3 switchとパターンマッチ

古典的な分岐はswitchです。

switch (status) {
  case "active":
    break;
  case "suspended":
    break;
}

現代的な言語では、より強力なパターンマッチが増えています。

match status {
    Status::Active => println!("active"),
    Status::Suspended => println!("suspended"),
}

パターンマッチでは、単なる値比較だけでなく、データの構造を分解できます。

match response:
    case {"status": 200, "data": data}:
        print(data)
    case {"status": 404}:
        print("not found")

比較ポイントは次です。

厳密比較か
型による分岐が可能か
内部データを分解できるか
全ケースを網羅したか検査されるか

3.4 繰り返し

代表的な繰り返しには次があります。

条件が成立する間繰り返す
コレクションの全要素を処理する
一定回数繰り返す

while

while count < 10:
    count += 1

foreach型

for user in users:
    print(user)

現代のコードでは、インデックスを直接操作するループより、コレクションの抽象操作を使う傾向があります。

active_users = [
    user
    for user in users
    if user.active
]
let active_users: Vec<_> = users
    .into_iter()
    .filter(|user| user.active)
    .collect();