Dev Study
← 解説「ジェネリック関数 — 型をパラメータにする」に戻る

サンプルコードで身につける: ジェネリック関数 — 型をパラメータにする

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1どんな型でもそのまま返す identity

型パラメータ T を受け取ってそのまま返すだけの、最小のジェネリック関数です。i32 にも &str にも f64 にも、同じ1つの定義で対応できています。呼び出し時に型を書かなくても、引数から T が推論される点に注目してください。

Rust

2型パラメータを2つ使う

<T, U> のように型パラメータは複数並べられ、それぞれ独立した型に決まります。文字列と数値、小数と真偽値など、どんな組み合わせでも1つの定義で組にできます。「型ごとに同じ関数を書き分けない」というジェネリクスの動機がいちばん見えやすい形です。

Rust

3スライス &[T] を受け取る

要素の型をジェネリックにすれば、数値のスライスでも文字列のスライスでも同じ関数で先頭要素を返せます。戻り値の &T は「要素と同じ型への参照」という意味で、所有権を奪わない点も含めて汎用的です。標準ライブラリのスライス系メソッドの多くがこの形をしています。

Rust

4Vec<T> を扱うヘルパー関数

「Vec の末尾から1件取り出す」処理を、要素の型を問わないヘルパーとして切り出した例です。戻り値が Option<T> なのは空の Vec に備えるためで、ジェネリクスとエラー処理のレッスンが自然に組み合わさっています。タスクキューやスタック処理など、実務のデータ操作ヘルパーの典型です。

Rust

5ジェネリックな構造体と impl<T>

Option<T> や Vec<T> と同じように、自作の構造体も <T> で型をパラメータにできます。impl<T> と書けば、メソッドもどの型に対しても1度だけ定義すれば済みます。実務では「中身の型だけ違う入れ物」(キャッシュ、ペア、レスポンスのラッパーなど)をこの形で作ります。

Rust