Rust 라이프타임 및 트레이트 바운드

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Rust 의 바운드 (bounds) 에 대해 배우며, 이는 제네릭 타입의 라이프타임 (lifetimes) 또는 트레이트 (traits) 를 제한하는 데 사용됩니다. : 문자는 타입 내의 모든 참조가 특정 라이프타임보다 오래 지속되어야 함을 나타내는 데 사용되며, +는 타입이 트레이트를 구현해야 하고 그 안의 모든 참조가 특정 라이프타임보다 오래 지속되어야 함을 나타내는 데 사용됩니다. 예시 코드 스니펫은 Rust 에서 바운드의 구문과 사용법을 보여줍니다.

참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어, main.rs를 사용하고 rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.

바운드 (Bounds)

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

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

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

use std::fmt::Debug; // Trait to bound with.

#[derive(Debug)]
struct Ref<'a, T: 'a>(&'a T);
// `Ref` contains a reference to a generic type `T` that has
// an unknown lifetime `'a`. `T` is bounded such that any
// *references* in `T` must outlive `'a`. Additionally, the lifetime
// of `Ref` may not exceed `'a`.

// A generic function which prints using the `Debug` trait.
fn print<T>(t: T) where
    T: Debug {
    println!("`print`: t is {:?}", t);
}

// Here a reference to `T` is taken where `T` implements
// `Debug` and all *references* in `T` outlive `'a`. In
// addition, `'a` must outlive the function.
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);
}

요약

축하합니다! 바운드 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.