어떤 trait 은 구현자가 고르는 타입을 가리켜야 해. 연관 타입 은 trait 에 선언되고 각 구현이 못 박는 placeholder 야. canonical 예가 Iterator 야.
Iterator trait
Iterator 는 type Item; 과 fn next(&mut self) -> Option<Self::Item> 를 선언해. 각 구현자가 Item 이 뭔지 골라 — 카운터는 u32 를, 줄 읽기는 String 을 내놔. 시그니처의 Self::Item 은 그 구현이 고른 게 뭐든 그걸 가리켜.
연관 타입 vs 제네릭 파라미터
Iterator<Item> 을 제네릭으로 상상할 수도 있어. 차이: 제네릭 파라미터는 한 타입이 다른 파라미터로 trait 을 여러 번 구현하게 해; 연관 타입은 구현마다 선택 하나 를 못 박아. 주어진 이터레이터는 원소 타입을 정확히 하나 내놓으니, 연관 타입이 딱 맞아 — 깔끔한 시그니처, 호출 지점에서 모호함 없음.
연관 타입 = impl 마다 선택 하나; 제네릭 파라미터 = 여러 impl. 각 구현자가 합리적 선택이 정확히 하나일 때 (이터레이터의 원소 타입) 연관 타입을 써. 한 타입이 여러 다른 타입에 대해 trait 을 구현할 수 있을 때 제네릭 파라미터를 써 — 여러 소스 타입에 여러 번 구현되는
From<T> 처럼.Iterator 구현하기
next 를 구현하고 Item 을 고르면, 네 타입이 즉시 이터레이터 도구함 전체를 얻어 — map, filter, sum, collect — 다 네 next 위에 지은 기본 메서드. defaults 레슨의 require-little-provide-lot 설계가 표준 라이브러리에서 제일 많이 쓰이는 trait 에서 본전을 뽑는 거야.