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

제네릭 매개변수 정의

이 장에서는 rustc가 어떤 제네릭 매개변수가 도입되는지를 어떻게 추적하는지 설명합니다. 예를 들어 struct Foo<T>가 주어졌을 때, rustc는 Foo가 타입 매개변수 T를 정의한다는 것(그리고 다른 제네릭 매개변수는 정의하지 않는다는 것)을 어떻게 추적합니까?

이 장에서는 for<'a> 구문(예: where 절이나 fn 타입)으로 도입되는 제네릭 매개변수를 추적하는 방법은 다루지 않습니다. 이 내용은 Binder에 관한 장에서 별도로 다룹니다.

ty::Generics

아이템이 도입하는 제네릭 매개변수는 ty::Generics 구조체로 추적합니다. 아이템에 따라서는 부모 아이템에 정의된 제네릭을 사용할 수 있습니다. 이는 ty::Generics 구조체에 제네릭 매개변수를 상속받을 부모 아이템을 지정하는 선택적 필드를 두는 방식으로 구현됩니다. 예를 들어, 다음 코드가 있다고 합시다.

trait Trait<T> {
    fn foo<U>(&self);
}

foo에 사용되는 ty::Generics는 [U]를 포함하고 부모로 Some(Trait)를 가집니다. Trait는 [Self, T]를 포함하고 부모가 None인 ty::Generics를 가집니다.

GenericParamDef 구조체는 ty::Generics 목록에 있는 개별 제네릭 매개변수 각각을 표현하는 데 사용됩니다. GenericParamDef 구조체에는 제네릭 매개변수에 관한 정보가 들어 있습니다. 예를 들어 이름, defid, 매개변수의 종류(즉, 타입, 상수, 라이프타임) 등이 있습니다.

GenericParamDef에는 매개변수의 위치(가장 바깥쪽 부모부터 셈)를 나타내는 u32 인덱스도 들어 있으며, 이 값은 제네릭 매개변수의 사용을 표현하는 데 쓰입니다(자세한 내용은 타입 표현에 관한 장을 참고하십시오).

흥미롭게도 현재 ty::Generics는 아이템에 정의된 제네릭 매개변수를 모두 포함하지는 않습니다. 함수의 경우에는 조기 바인딩(early bound) 매개변수만 포함합니다.