到達点は、入力と戻り値の型を明示し、境界を含む処理を組み立てることです。前提は第02回です。
関数の入口と出口を決める
fnの引数には型を書き、戻り値は矢印の後に書きます。関数の末尾の式が戻り値になります。早く処理を終えたい場所ではreturnも使えます。
fn shipping(amount: u32, member: bool) -> u32 {
let threshold = if member { 3000 } else { 5000 };
if amount >= threshold { 0 } else { 500 }
}
fn main() {
let mut total = 0;
for amount in [0, 4999, 5000] {
let fee = shipping(amount, false);
total += fee;
println!("{amount}: {fee}");
}
println!("合計: {total}");
let mut attempt = 0;
let result = loop {
attempt += 1;
if attempt == 3 { break attempt * 10; }
};
println!("{result}");
}
src/main.rsで実行すると送料は500、500、0、合計1000、最後は30です。loopは明示的にbreakするまで続き、breakに値を付けて結果を返せます。whileは条件が真の間続きます。
範囲と列挙を使い分ける
0..3 は0、1、2で、0..=3 は3も含みます。配列の添字のためだけに範囲を書くより、要素を直接forで受け取る方が範囲外アクセスを避けやすくなります。添字も必要ならiterとenumerateを使う方法を第10回で学びます。
matchは値の形に応じて分岐します。扱う可能性を網羅する必要があり、列挙型と組み合わせると「状態を一つ扱い忘れた」問題を発見しやすくなります。単純な条件ならif、値の種類で分けるならmatchという使い分けを意識します。
今回の購入額はu32なので、関数へ負の整数をそのまま渡せません。ただし「負を拒否する」だけで、現実の上限や不正な文字列まで解決できるわけではありません。文字列から型へ変換する入口にも検査が必要です。
練習と解答
練習:会員の2999と3000、非会員の4999と5000を試し、期待した送料を書いてください。
解答:順に500、0、500、0です。境界を一つずつ挟んで試すことで、以上と超過の取り違えを発見できます。すべての数値を試すより、仕様が切り替わる点を選ぶのが基本です。
公式資料
Rust全20回の目次 | 前の回 | 次の回