바운드
제네릭 타입이 바운드될 수 있는 것처럼, (그 자체로 제네릭인) 라이프타임도 바운드를 사용합니다. 여기서 : 문자는 약간 다른 의미를 갖지만, +는 동일합니다. 다음이 어떻게 읽히는지 주목하세요:
T: 'a:T내의 모든 참조는 라이프타임'a보다 오래 살아야 합니다.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);
}
참고:
제네릭, 제네릭의 바운드, 그리고 제네릭의 다중 바운드