到達点は、変更できる値を明示し、数値の失敗を予測することです。前提は第01回です。
変更は明示する
letの束縛は既定では再代入できません。更新したければmutを付けます。同じ名前をletで宣言し直すシャドーイングは、再代入とは別で、型を変えることもできます。どちらも使えますが、読み手が値の流れを追えるように選びます。
fn main() {
let mut minutes: u32 = 20;
minutes += 5;
let input = " 30 ";
let input: u32 = input.trim().parse().expect("教材の数値は有効");
let total = minutes + input;
let label = if total >= 50 { "目標達成" } else { "継続" };
println!("{total} {label}");
println!("{}", 7 / 2);
println!("{}", 7.0_f64 / 2.0);
println!("{:?}", u8::MAX.checked_add(1));
}
src/main.rsへ保存してcargo runすると、55と目標達成、3、3.5、Noneが出ます。u32は符号なし32ビット整数、i32は符号付き32ビット整数です。usizeは添字などに使う、プラットフォームに応じた幅の整数です。
式は値を返す
ifは式として値を返せます。その場合、各分岐の型を合わせます。ブロック末尾にセミコロンのない式を置くと、それがブロックの値になります。セミコロンを付けると文になり、意図した値を返さなくなることがあります。
整数の桁あふれは、ビルド設定によってpanicになったりラップする演算になったりするため、必要な意味を明示します。checked_addは失敗をOptionで返し、saturating_addは端の値へ飽和し、wrapping_addは回り込みを表します。「本番ビルドだから安全」ではありません。
expectは失敗時にpanicします。今回の固定文字列では教材の前提を説明するため使いました。利用者が入力する文字列へ同じように使わず、第07回のResultで扱います。
練習と解答
練習:残り件数が0のときに1を引く処理を、失敗が分かる形にしてください。
解答例:0_u32.checked_sub(1) はNoneを返します。残りが0なら0のままにする仕様ならsaturating_subも候補ですが、入力ミスを見逃す可能性があるため、どの意味が必要かを先に決めます。
公式資料
Rust全20回の目次 | 前の回 | 次の回