함수
함수에도 동일한 규칙이 적용될 수 있습니다: 타입 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'));
}