my.code(); Logomy.code();
Rust-2.関数と制御フロー

my.code(); Logomy.code();

  • C++
    • 0.C++の世界へようこそ
    • 1.型システムと制御構造
    • 2.データ集合とモダンな操作
    • 3.ポインタとメモリ管理
    • 4.関数と参照渡し
    • 5.プロジェクトの分割とビルド
    • 6.クラスの基礎
    • 7.クラスを使いこなす
    • 8.継承とポリモーフィズム
    • 9.テンプレート
    • 10.STL ①:コンテナ
    • 11.STL ②:アルゴリズムとラムダ式
    • 12.RAIIとスマートポインタ
  • JavaScript
    • 0.JavaScriptへようこそ
    • 1.基本構文とデータ型
    • 2.制御構文
    • 3.関数とクロージャ
    • 4.'this'の正体
    • 5.オブジェクトとプロトタイプ
    • 6.クラス構文
    • 7.配列とイテレーション
    • 8.非同期処理①: Promise
    • 9.非同期処理②: Async/Await
  • Python
    • 0.環境構築と基本思想
    • 1.基本構文とデータ型
    • 2.リスト、タプル、辞書、セット
    • 3.制御構文と関数
    • 4.モジュールとパッケージ
    • 5.オブジェクト指向プログラミング
    • 6.ファイルの入出力とコンテキストマネージャ
    • 7.例外処理
    • 8.ジェネレータとデコレータ
  • Ruby
    • 0.rubyの世界へようこそ
    • 1.基本構文とデータ型
    • 2.制御構造とメソッド定義
    • 3.すべてがオブジェクト
    • 4.コレクション (Array, Hash, Range)
    • 5.ブロックとイテレータ
    • 6.クラスとオブジェクト
    • 7.モジュールとMix-in
    • 8.Proc, Lambda, クロージャ
    • 9.標準ライブラリの活用
    • 10.テスト文化入門
    • 11.メタプログラミング入門
  • Rust
    • 0.Rustの世界へようこそ
    • 1.基本構文と「不変性」
    • 2.関数と制御フロー
    • 3.所有権
    • 4.借用とスライス
    • 5.構造体とメソッド構文
    • 6.列挙型とパターンマッチ
    • 7.モジュールシステムとパッケージ管理
    • 8.コレクションと文字列
    • 9.エラーハンドリング
    • 10.ジェネリクスとトレイト
    • 11.ライフタイム
  • TypeScript
    • 0.TypeScriptへようこそ
    • 1.基本的な型と型推論
    • 2.オブジェクト、インターフェース、型エイリアス
    • 3.関数の型定義
    • 4.型を組み合わせる
    • 5.ジェネリクス
    • 6.クラスとアクセス修飾子
    • 7.非同期処理とユーティリティ型
my.code(); Logomy.code();

環境構築不要、その場で実践。

ut-code / my-code

Copyright © 2026 ut.code();

my.code(); について
コード実行環境についてAI質問機能についてライセンスお問い合わせ
ut.code(); について
公式ウェブサイト公式 𝕏 アカウント

第2章: 関数と制御フロー

他の言語での経験がある皆さんなら、関数やループの基本的な概念はすでにご存知でしょう。しかし、Rustには「すべてが式である」という強力な設計思想があり、これが制御フローの書き方にも大きく影響しています。

この章では、Rust特有の「文(Statement)と式(Expression)」の違いを理解し、それを踏まえた関数の定義方法と、柔軟な制御フローについて学びます。

関数と「式」指向

Rustの関数定義は fn キーワードを使用し、変数や関数の命名規則にはスネークケース(snake_case)を採用するのが慣例です。

引数と戻り値

Rustは静的型付け言語であるため、関数の定義では各引数の型を必ず宣言する必要があります。戻り値がある場合は、矢印 -> の後に型を記述します。

文(Statement)と式(Expression)

Rustを理解する上で最も重要な概念の一つがこれです。

  • 文 (Statement): 何らかの操作を行い、値を返さないもの(例: let y = 6;)。
  • 式 (Expression): 評価されて結果の値を返すもの(例: 5 + 6、{ code_block }、関数呼び出し)。

他の多くの言語と異なり、Rustではブロックの最後の式がそのブロックの戻り値になります。return キーワードを使うこともできますが、一般的には「最後の行のセミコロンを省略する」スタイルが好まれます。

以下のコードで確認してみましょう。

ファイルを編集:functions_demo.rs
fn main() {
    let x = 5;
    let y = 10;

    // 値を返す関数呼び出し
    let result = add(x, y);
    println!("{} + {} = {}", x, y, result);

    // 文と式の違いを示すブロック
    let z = {
        let a = 3;
        a + 1 // セミコロンがないので、この式が評価されzに代入される
    };

    println!("zの値: {}", z);
}

// 引数を取り、i32型を返す関数
fn add(a: i32, b: i32) -> i32 {
    // 最後の行にセミコロンがないため、この式の計算結果が戻り値となる
    // "return a + b;" と書くのと同じ意味だが、こちらがRustらしい書き方
    a + b
}
ブラウザ上で動作するrustの実行環境です。
左上の実行ボタンを押して、このページ内のfunctions_demo.rsに書かれている内容を実行します。
5 + 10 = 15
zの値: 4

注意: もし a + 1 の後ろにセミコロンをつけて a + 1; とすると、それは「文」となり、値を返さなくなります(正確には空のタプル () を返します)。コンパイルエラーの原因になりやすいため注意してください。

制御フロー

Rustの制御フロー(if, loop, while, for)もまた「式」として扱うことができます。

if 式

Rustの if は式です。つまり、条件分岐の結果を変数に代入することができます。 三項演算子(condition ? a : b)のような専用の構文はRustにはありませんが、if がその役割を果たします。

重要なルールとして、条件式は必ず bool 型でなければなりません。JavaScriptやC++のように、数値を自動的に true/false に変換することはありません。

ファイルを編集:if_expression.rs
fn main() {
    let condition = true;
    
    // ifの結果を変数に束縛できる
    // ifブロックとelseブロックが返す型は同じである必要がある
    let number = if condition {
        5
    } else {
        6
    };

    println!("numberの値: {}", number);
}
ブラウザ上で動作するrustの実行環境です。
左上の実行ボタンを押して、このページ内のif_expression.rsに書かれている内容を実行します。
numberの値: 5

ループ構造

Rustには3種類のループがあります。

  1. loop: 無限ループ
  2. while: 条件付きループ
  3. for: コレクションや範囲に対するループ

loop と値の戻り

loop キーワードは、明示的に break するまで永遠に繰り返します。面白い機能として、break の後に値を置くことで、ループ全体の結果としてその値を返すことができます。

ファイルを編集:loop_return.rs
fn main() {
    let mut counter = 0;

    // ループの結果を変数resultに代入
    let result = loop {
        counter += 1;

        if counter == 10 {
            // カウンタが10になったら、counter * 2 の値を返して終了
            break counter * 2;
        }
    };

    println!("ループの結果: {}", result);
}
ブラウザ上で動作するrustの実行環境です。
左上の実行ボタンを押して、このページ内のloop_return.rsに書かれている内容を実行します。
ループの結果: 20

while

while は他の言語とほぼ同じです。条件が真である限り実行されます。

ファイルを編集:while_loop.rs
fn main() {
    let mut number = 3;
    while number != 0 {
        println!("{}!", number);
        number -= 1;
    }
}
ブラウザ上で動作するrustの実行環境です。
左上の実行ボタンを押して、このページ内のwhile_loop.rsに書かれている内容を実行します。
3!
2!
1!

for ループ

Rustで最も安全かつ頻繁に使用されるのが for ループです。配列の要素を走査したり、特定の回数だけ処理を行ったりする場合、インデックス管理が不要な for が推奨されます。

数値の範囲を指定する場合は Range 型(start..end)を使用します。

ファイルを編集:for_loop.rs
fn main() {
    let a = [10, 20, 30, 40, 50];

    // 配列のイテレータを使ったループ
    println!("--- 配列の走査 ---");
    for element in a.iter() {
        println!("値: {}", element);
    }

    // Rangeを使ったループ (1から3まで。4は含まない)
    println!("--- 範囲指定 ---");
    for number in 1..4 {
        println!("カウント: {}", number);
    }
}
ブラウザ上で動作するrustの実行環境です。
左上の実行ボタンを押して、このページ内のfor_loop.rsに書かれている内容を実行します。
--- 配列の走査 ---
値: 10
値: 20
値: 30
値: 40
値: 50
--- 範囲指定 ---
カウント: 1
カウント: 2
カウント: 3

この章のまとめ

  • 関数: パラメータの型と戻り値の型を明示する。
  • 文と式: Rustは式指向であり、セミコロンのない最後の式がブロックの戻り値となる。
  • if式: if は値を返すことができる。条件は必ず bool でなければならない。
  • ループ: loop(無限・値返し可能)、while(条件付き)、for(イテレータ・範囲)があり、特に for が推奨される。

練習問題 1: 摂氏・華氏変換

摂氏(Celsius)を華氏(Fahrenheit)に変換する関数 c_to_f を作成してください。 公式: F = C × 1.8 + 32

ファイルを編集:practice3_1.rs
fn main() {
    let celsius_temp = 25.0;
    let fahrenheit_temp = c_to_f(celsius_temp);
    println!("{}°C は {}°F です", celsius_temp, fahrenheit_temp);
}

// ここに関数を実装してください
ブラウザ上で動作するrustの実行環境です。
左上の実行ボタンを押して、このページ内のpractice3_1.rsに書かれている内容を実行します。
25°C は 77°F です

練習問題 2: フィボナッチ数列

第 n 番目のフィボナッチ数を求める関数 fib を実装してください。 制御フロー(if または ループ)を使用してください。 (定義: 第0項=0, 第1項=1, 第n項 = 第n-1項 + 第n-2項)

ファイルを編集:practice3_2.rs
fn main() {
    let n = 10;
    println!("フィボナッチ数列の第 {} 項は {} です", n, fib(n));
}

// ここに関数を実装してください
ブラウザ上で動作するrustの実行環境です。
左上の実行ボタンを押して、このページ内のpractice3_2.rsに書かれている内容を実行します。
フィボナッチ数列の第 10 項は 55 です
前のページ« 基本構文と「不変性」
次のページ所有権 »