지난 레슨이 벽에 부딪혔어: 맨 T 는 비교도 출력도 못 해. trait bound 가 컴파일러한테 '이 T 는 이 능력들을 가져' 라고 말하는 법이야 — 그럼 갑자기 제네릭 코드가 돼.
타입 파라미터 제약하기
fn largest<T: PartialOrd>(list: &[T]) -> &T 는 'T 는 PartialOrd 를 구현해야 해' 라고 말해 — > 랑 < 연산자 뒤의 trait. 이제 본문이 값을 비교할 수 있고 컴파일러가 받아들여. bound 는 약속이야: 호출자는 그걸 만족하는 타입만 쓸 수 있고, 대신 본문은 그 trait 이 제공하는 모든 걸 쓸 수 있어.
여러 bound 와 where 절
+ 로 bound 를 쌓아: T: Display + Clone 은 T 가 출력 가능하고 clone 가능해야 한다는 뜻. bound 가 쌓이면 where 절이 그걸 시그니처 아래로 옮겨 가독성을 줘 — 같은 뜻, 타입 파라미터 여럿이 각각 bound 여럿을 가질 때 읽기 깔끔해.
trait bound 는 능력 계약이야.
T: Display 는 'T 가 뭐든, 출력 가능해' 라고 읽혀. bound 는 호출자에 대한 제한 (출력 가능한 타입만 허용) 이면서 동시에 본문에 대한 허가 (T 를 출력해도 됨) 야. 그 대칭이 제네릭 Rust 의 심장이야.impl Trait 단축
파라미터에 bound 하나면 fn notify(item: &impl Summary) 가 fn notify<T: Summary>(item: &T) 의 단축이야. 자연스럽게 읽혀 — 'Summary 를 구현하는 아무거나 받아.' 단순한 경우에 써; 타입을 이름 붙이거나 파라미터들에 걸쳐 재사용해야 하면 명시적 <T> 형태로 손 뻗어.