Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

関数

同じ一連のルールを関数にも適用できます。型 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'));
}

関連項目:

関数struct