13.4.5 Bounds
제네릭 타입이 바인드 될 수 있는 것과 마찬가지로, 생명주기(그들 자신의 제네릭)도 바인드를 사용한다. :
문자는 미묘하게 의미가 다르지만, +
는 동일하다. 주의해서 다음을 읽어보자:
T: 'a
:T
의 모든 참조는'a
보다 더 오래 유지되야 한다.T: Trait + 'a
: 타입T
는 반드시 traitTrait
을 구현하고 모든 참조된T
는 반드시'a
보다 오래 유지되야 한다.
아래서 보여주는 예제를 통해 상기 문맥의 동작을 살펴보자:
use std::fmt::Debug; // 함께 바인드 될 trait. #[derive(Debug)] struct Ref<'a, T: 'a>(&'a T); // `Ref`는 제네릭 타입 `T`에 참조를 포함하고 이는 알 수 없는 생명주기 // `'a`를 갖는다. `T`가 바인드 될 수 있는 모든 *참조*는 반드시 `'a`보다 // 오래 유지되어야 한다. 추가로, `Ref`의 생명주기는 `'a`를 초과할 수 없다. // `Debug` trait을 사용해 출력하는 제네릭 함수. fn print<T>(t: T) where T: Debug { println!("`print`: t is {:?}", t); } // `Debug`를 구현하는 `'a`보다 오래 유지되는 `T`에 대한 모든 *참조*를 // 취한다. 또한 `'a`는 반드시 함수보다 오래 유지되어야 한다. fn print_ref<'a, T>(t: &'a T) where T: Debug + 'a { println!("`print_ref`: t is {:?}", t); } fn main() { let x = 7; let ref_x = Ref(&x); print_ref(&ref_x); print(ref_x); }
See also:
generics, bounds in generics, and multiple bounds in generics