関数
同じ一連のルールを関数にも適用できます。型 T は、 <T> が前に付くとジェネリックになります。
ジェネリック関数を使用する場合、型パラメータを明示的に指定する必要があることがあります。 これは、戻り値の型がジェネリックな場所で関数が呼び出される場合や、 コンパイラが必要な型パラメータを推論するのに十分な情報を持っていない場合に起こり得ます。
型パラメータを明示的に指定した関数呼び出しは、次のようになります。 fun::<A, B, ...>().
struct A; // 具象型 `A`。 struct S(A); // 具象型 `S`。 struct SGen<T>(T); // ジェネリック型 `SGen`。 // 以下の関数はすべて、渡された変数の所有権を受け取り、 // すぐにスコープを抜けて、その変数を解放します。 // 型 `S` の引数 `_s` を取る関数 `reg_fn` を定義します。 // これには `<T>` がないため、ジェネリック関数ではありません。 fn reg_fn(_s: S) {} // 型 `SGen<T>` の引数 `_s` を取る関数 `gen_spec_t` を定義します。 // 型パラメータ `A` が明示的に与えられていますが、`A` は // `gen_spec_t` のジェネリック型パラメータとして指定されていないため、ジェネリックではありません。 fn gen_spec_t(_s: SGen<A>) {} // 型 `SGen<i32>` の引数 `_s` を取る関数 `gen_spec_i32` を定義します。 // 特定の型である型パラメータ `i32` が明示的に与えられています。 // `i32` はジェネリック型ではないため、この関数もジェネリックではありません。 fn gen_spec_i32(_s: SGen<i32>) {} // 型 `SGen<T>` の引数 `_s` を取る関数 `generic` を定義します。 // `SGen<T>` の前に `<T>` が付いているため、この関数は `T` に対してジェネリックです。 fn generic<T>(_s: SGen<T>) {} fn main() { // 非ジェネリック関数を使用します reg_fn(S(A)); // 具象型。 gen_spec_t(SGen(A)); // 暗黙的に指定された型パラメータ `A`。 gen_spec_i32(SGen(6)); // 暗黙的に指定された型パラメータ `i32`。 // `generic()` に型パラメータ `char` を明示的に指定します。 generic::<char>(SGen('a')); // `generic()` に型パラメータ `char` を暗黙的に指定します。 generic(SGen('c')); }