C.W.K.
Stream
Lesson 04 of 07 · published

Trait Bound

~12 min · traits, bounds, where

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

지난 레슨이 벽에 부딪혔어: 맨 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> 형태로 손 뻗어.

Code

bound 가 본문이 필요한 연산을 풀어준다·rust
use std::fmt::Display;

// T 는 비교 (>) 를 지원해야 함 — PartialOrd bound 가 풀어줌
fn largest<T: PartialOrd>(list: &[T]) -> &T {
    let mut biggest = &list[0];
    for item in list {
        if item > biggest { biggest = item; }
    }
    biggest
}

// bound 하나에 대한 impl Trait 단축
fn announce(item: &impl Display) {
    println!("News! {item}");
}

fn main() {
    println!("{}", largest(&[3, 7, 2, 9, 4])); // i32 에 통함
    println!("{}", largest(&['c', 'a', 'z'])); // char 에도
    announce(&"fearless");
}

External links

Exercise

각 항목을 출력하는 fn print_all<T: Display>(items: &[T]) 를 써봐. 그다음 첫 항목을 clone 해서 반환하게 bound 를 하나 더해: <T: Display + Clone>. 그 다중 bound 시그니처를 where 절로 다시 써. bound 가 늘면 어느 형태가 잘 읽혀?
Hint
인라인 bound (<T: Display + Clone>) 는 하나둘엔 괜찮고; where 절은 파라미터 여럿이 각각 bound 여럿을 실으면 시그니처 줄을 깔끔하게 유지해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.