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