Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ジェネリクス(<T>)/ 型パラメータ
ジェネリクスは、型をパラメータとして受け取れる汎用的な関数・構造体・列挙型を定義する仕組みで、コードの重複を避けながら型安全性を保てます。
構文
// 関数のジェネリクス
fn 関数名<T>(引数: T) -> T { ... }
// 複数の型パラメータ
fn 関数名<T, U>(a: T, b: U) { ... }
// 構造体のジェネリクス
struct 構造体名<T> {
フィールド: T,
}
// 列挙型のジェネリクス(Optionの定義例)
enum Option<T> {
Some(T),
None,
}
// implブロックのジェネリクス
impl<T> 構造体名<T> {
fn メソッド名(&self) -> &T { &self.フィールド }
}
型パラメータ一覧
| 記法 | 概要 |
|---|---|
| <T> | 単一の型パラメータです。慣例的に大文字1文字を使います。 |
| <T, U> | 複数の型パラメータです。それぞれ独立した型を受け取ります。 |
| <T: Trait> | トレイト境界付き型パラメータです。特定のトレイトを実装した型に限定します。 |
| struct Foo<T> | 構造体をジェネリクスにします。フィールドの型を外部から指定できます。 |
| impl<T> Foo<T> | ジェネリクス構造体にメソッドを実装します。 |
サンプルコード
// ジェネリクス関数:どんな型の最大値も求められます。
fn largest<T: PartialOrd>(a: T, b: T) -> T {
if a > b { a } else { b }
}
// ジェネリクス構造体:任意の型の値を保持します。
struct Pair<T> {
first: T,
second: T,
}
impl<T: std::fmt::Display> Pair<T> {
fn show(&self) {
println!("({}, {})", self.first, self.second);
}
}
fn main() {
// 整数でも浮動小数点でも同じ関数が使えます。
println!("{}", largest(3, 7)); // 7
println!("{}", largest(2.5, 1.8)); // 2.5
// 構造体の型パラメータは推論されます。
let p = Pair { first: 10, second: 20 };
p.show(); // (10, 20)
let s = Pair { first: "hello", second: "world" };
s.show(); // (hello, world)
}
概要
ジェネリクスを使うと、同じロジックを異なる型に対して再利用できます。Rustはコンパイル時に各型について具体的なコードを生成する「単相化(monomorphization)」を行うため、実行時のオーバーヘッドはありません。
型パラメータ名は慣例的に『T』『U』『V』のような大文字1文字が使われますが、任意の名前を付けることもできます。複数の型パラメータが必要な場合は『<T, U>』のようにカンマで区切ります。
トレイト境界なしの型パラメータは、演算子(>、+など)を使用できません。型に対して特定の操作を行いたい場合は、トレイト境界を指定する必要があります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。