制御構造は、「どの処理を、どの順番で、何回実行するか」を決めます。
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();