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

바운드

제네릭 타입이 바운드될 수 있는 것처럼, (그 자체로 제네릭인) 라이프타임도 바운드를 사용합니다. 여기서 : 문자는 약간 다른 의미를 갖지만, +는 동일합니다. 다음이 어떻게 읽히는지 주목하세요:

  1. T: 'a: T 내의 모든 참조는 라이프타임 'a보다 오래 살아야 합니다.
  2. T: Trait + 'a: 타입 T는 트레이트 Trait를 구현해야 하며, T 내의 모든 참조는 'a보다 오래 살아야 합니다.

아래 예제는 where 키워드 뒤에 사용된 위 구문의 실제 사용 예를 보여줍니다:

use std::fmt::Debug; // 바운드할 트레이트.

#[derive(Debug)]
struct Ref<'a, T: 'a>(&'a T);
// `Ref`는 `Ref`가 알 수 없는 어떤 라이프타임 `'a`를 가진 제네릭 타입 `T`에 대한
// 참조를 포함합니다. `T`는 `T` 내부의 모든 *참조*가 `'a`보다 오래 살아야 한다는
// 바운드를 가집니다. 추가적으로, `Ref`의 라이프타임은 `'a`를 초과할 수 없습니다.

// `Debug` 트레이트를 사용하여 출력하는 제네릭 함수.
fn print<T>(t: T) where
    T: Debug {
    println!("`print`: t는 {:?}입니다", t);
}

// 여기서 `T`는 `Debug`를 구현하고 `T`의 모든 *참조*가 `'a`보다 오래 사는
// `T`에 대한 참조를 받습니다. 또한, `'a`는 함수보다 오래 살아야 합니다.
fn print_ref<'a, T>(t: &'a T) where
    T: Debug + 'a {
    println!("`print_ref`: t는 {:?}입니다", t);
}

fn main() {
    let x = 7;
    let ref_x = Ref(&x);

    print_ref(&ref_x);
    print(ref_x);
}

참고:

제네릭, 제네릭의 바운드, 그리고 제네릭의 다중 바운드