本文へスキップ
BecomeCoder

Rustコース · 第2章 制御構文と関数 · レッスン6

関数と式指向 ― fn と戻り値

ブラウザで完結

導入

処理に名前を付けて再利用できるようにするのが 関数 です。Rust の関数には「戻り値は最後の」という独特のルールがあり、ここが式指向の入り口になります。

説明

fn main() {
    let sum = add(3, 4);
    println!("合計: {sum}");

    greet("Rust");
}

// 引数に型注釈、戻り値は -> のあとに型を書く
fn add(a: i32, b: i32) -> i32 {
    a + b       // ← セミコロンなし。これが戻り値になる
}

// 戻り値がない関数は -> を省略できる
fn greet(name: &str) {
    println!("こんにちは、{name}!");
}
  • fn add(a: i32, b: i32) -> i32 … 引数には必ず型注釈が要ります。-> i32 は戻り値の型。
  • a + b … 関数の最後の式が戻り値になります。セミコロンを付けないのがポイント。
  • もし a + b; とセミコロンを付けると、それは「値を返さない」になり、戻り値が ()(空)になってしまいエラーです。

ここで Rust の核心「文(statement)と式(expression)」の違いです。

  • :何かを実行するが、値を返さない(例:let x = 5;)。
  • :評価されると値になる(例:5 + 3、関数呼び出し、{ ... } ブロック)。

ブロック { ... } すら式です。最後の式がブロックの値になります。

fn main() {
    let y = {
        let a = 3;
        a + 1        // セミコロンなし → このブロックは 4 という値になる
    };
    println!("y = {y}");   // y = 4
}

return を使って途中で返すこともできますが、Rust では「最後の式を返す」書き方が基本です。

試すには

adda + ba + b; に変えると、expected i32, found () というエラーが出ます。「セミコロンを付けると値が消える」——式指向の言語ならではの挙動です。

実際に動かしてみよう

下のエディタにRustを書いて「実行」を押すと、学習用シミュレータが println! の出力を表示します(本物のrustcではなく、教材の範囲を再現した軽量エンジンです)。struct・enum・match・トレイト・Vec/String/HashMap・Option/Result なども動きます。本文の例を書き換えて動かしてみましょう(所有権・借用チェッカーのコンパイルエラーは再現しないため、動きの確認用として使ってください)。

Rust — ブラウザ内で実行(学習用シミュレータ)

Rustの教材サブセットを動かす学習用シミュレータを読み込みます(本物のrustcではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。