12.1 Functions

동일한 규칙들이 함수에도 적용된다: T 타입은 선행된 <T>가 있을 시에 제네릭이 된다.

제네릭 함수의 사용 시에 종종 요구되는 사항은 명시적으로 타입 매개변수를 기입하는 것이다. 이런 경우는 아마도 반환 타입으로 제네릭을 사용하거나 컴파일러가 타입 매개변수를 추정하기 충분한 정보를 확보하지 못했기 때문이다.

명시적으로 기입된 타입 매개변수로 함수 호출은 다음과 같다: fun::<A, B, ...>().

struct A;          // 구체적 타입 `A` 
struct S(A);       // 구체적 타입 `S`
struct SGen<T>(T); // 제네릭 타입 `SGen`

// 다음에 오는 함수들은 변수의 소유권을 취하여 그들에게 전달하고 
// 범위에서 벗어나면 즉각적으로 변수를 해제한다.
// 인자로 타입 `S`인 `_s`를 취하는 함수 `reg_fn`을 정의한다.
// 이는 ``가 없으므로 제네릭 함수가 아니다.
fn reg_fn(_s: S) {}

// 인자로 타입 `SGen`인 `_s`를 취하는 함수 `gen_spec_t`를 정의한다.
// 타입 매개변수로 `A`가 명시적으로 주어졌지만 `A`가 제네릭 타입 매개변수가
// 아니기 때문에 `gen_spec_t`는 제네릭이 아니다. 
fn gen_spec_t(_s: SGen<A>) {}

// 인자로 타입 `SGen`인 `_s`를 취하는 `gen_spec_i32`를 정의한다.
// 타입 매개변수로 `i32`가 명시적으로 주어졌고 이는 구체적 타입이다.
// `i32`가 제네릭 타입이 아니기 때문에 함수 역시 제네릭이 아니다.
fn gen_spec_i32(_s: SGen<i32>) {}

// 인자로 타입 `SGen`인 `_s`를 취하는 `generic`을 정의한다. 
// `SGen`의 앞에 ``로 인해, 이 함수는 `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`로 암시적 지정.

    // 타입 매개변수 `char`를 `generic()`에 명시적 지정.
    generic::<char>(SGen('a'));

    // 타입 매개변수 `char`를 `generic()`에 암시적 지정.
    generic(SGen('c'));
}

See also:

functions and structs

results matching ""

    No results matching ""