1引数なしの関数を呼び出す
fn で関数を定義して main から呼ぶ、いちばん素朴な例です。引数も戻り値もなくても、「名前の付いたひとまとまりの処理」として切り出せます。同じ表示を何か所でも使い回せるようになるのが関数の出発点です。
fn show_banner() {
println!("=== 計算アプリ ===");
}
fn main() {
show_banner();
println!("ようこそ!");
}
2引数と戻り値 — 最後の式が返る
引数の型注釈と -> の戻り値型、そして「セミコロンなしの最後の式が戻り値になる」という Rust の核心を示す例です。n * n の後ろにセミコロンがない点に注目してください。ここにセミコロンを付けると戻り値が () になり型エラーになる、というのが最頻出のつまずきです。
fn square(n: i32) -> i32 {
n * n // セミコロンなしの式が戻り値になる
}
fn main() {
println!("3の2乗 = {}", square(3));
println!("12の2乗 = {}", square(12));
}
3ブロックも式 — 値を返す波括弧
let は値を返さない「文」、ブロック { ... } は値を返す「式」という区別を1つのプログラムで確かめる例です。ブロックの最後にセミコロンなしで base + 1 を置くと、それが y に入ります。中間変数を外に漏らさず計算をまとめたいとき、実務でもこの書き方を使います。
fn main() {
let x = 5; // let は「文」: 値を返さない
// ブロックは「式」: 最後のセミコロンなしの式が値になる
let y = {
let base = x * 2;
base + 1
};
println!("x = {}, y = {}", x, y);
}
4関数から関数を呼んで組み立てる
税額を出す tax と、それを使って税込価格を出す total_price という2つの関数を組み合わせる例です。小さな関数に分けておくと、税率の変更は tax の1か所だけ直せば済みます。「計算のルールごとに関数を分ける」のは実務コードの基本的な整理術です。
fn tax(price: i32) -> i32 {
price / 10 // 税額(10%)
}
fn total_price(price: i32) -> i32 {
price + tax(price) // 関数から別の関数を呼ぶ
}
fn main() {
let price = 1200;
println!("本体 = {}円", price);
println!("税込 = {}円", total_price(price));
}
5単位変換ヘルパーを関数にまとめる
摂氏→華氏、分→秒という単位変換を関数として用意しておく実務寄りの例です。変換式が関数名と型(f64 を受けて f64 を返す、など)で自己説明的になり、呼び出し側は式を覚える必要がなくなります。設定値の変換やフォーマット処理など、「小さいが何度も使う計算」は関数化が定石です。
fn celsius_to_fahrenheit(c: f64) -> f64 {
c * 9.0 / 5.0 + 32.0
}
fn minutes_to_seconds(minutes: u32) -> u32 {
minutes * 60
}
fn main() {
println!("摂氏25度 = 華氏{}度", celsius_to_fahrenheit(25.0));
println!("90分 = {}秒", minutes_to_seconds(90));
}