13.4.5 Bounds

제네릭 타입이 바인드 될 수 있는 것과 마찬가지로, 생명주기(그들 자신의 제네릭)도 바인드를 사용한다. : 문자는 미묘하게 의미가 다르지만, +는 동일하다. 주의해서 다음을 읽어보자:

  1. T: 'a: T모든 참조는 'a보다 더 오래 유지되야 한다.
  2. T: Trait + 'a: 타입 T는 반드시 trait Trait을 구현하고 모든 참조된 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

results matching ""

    No results matching ""