13.4.1 Explicit annotation

대여 검사자는 명시적 생명주기 주해를 사용해 참조가 얼마나 오래 유효할지를 결정한다. 이런 생명주기가 생략되지 않은 경우1, Rust가 요구하는 명시적 주해가 참조가 가져야 할 생명주기의 결정을 위해 필요하다. 명시적 주해를 위한 문법은 다음처럼 생략기호를 사용한다.

foo<'a>
// `foo` 는 생명주기 매개자 `'a`를 가졌다.

closures와 유사하게, 생명주기의 사용은 제네릭이 필요로 한다. 추가로, 생명주기 문법이 나타내는 것은 foo의 생명주기가 'a를 초과하지 않는다. 타입의 명시적 주해는 '&a T 형식에서 'a로 이미 소개하였다.

다수의 생명주기를 갖는 경우에도 문법은 비슷한다:

foo<'a, 'b>
// `foo` 는 생명주기 매개자 `'a` 와 `'b`를 가졌다.

이런 경우에, foo의 생명주기는 'a 혹은 'b 어느 한 쪽도 넘을 수 없다.

다음 예제를 통해 명시적 생명주기 주해의 사용을 살펴보자:

// `print_refs`는 서로 다른 `'a`와 `'b`의 생명주기를 갖는 두 `i32`참조를 취한다.
// 이들 두 생명주기는 최소한 `print_refs`함수 만큼 길어야 한다.
fn print_refs<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("x is {} and y is {}", x, y);
}

// 매개변수 없이 생명주기 매개자 `'a`를 갖는 함수. 
fn failed_borrow<'a>() {
    let _x = 12;

    // 에러!: `_x`가 충분히 유지되지 못함.
    //let y: &'a i32 = &_x;
    // `&_x'의 수명이 `y`의 수명보다 짧기 때문에 함수 안에서 명시적 타입 주해로 
    // 생명주기 `'a`를 사용하려고 시도하면 실패한다. 
    // 짧은 수명은 더 긴 수명으로 강제 변환 될 수 없다.
}

fn main() {
    // 대여 목적의 변수 생성.
    let (four, nine) = (4, 9);

    // 양 변수의 대여(`&`)가 함수로 전달된다.
    print_refs(&four, &nine);
    // 대여된 모든 입력 값들은 반드시 대여자보다 오래 유지되어야 한다.
    // 다른 말로 하면, `four`나 `nine`의 생명주기는 반드시 
    // `print_refs`보다 더 길어야 한다. 

    failed_borrow();
    // `failed_borrow`는 `'a`가 함수의 수명보다 길도록 강제하는 참조가 없지만 
    // `'a`는 길어진다. 왜냐면, 생명주기가 강제되지 않은 경우 
    // 그 기본값은 `'static`으로 된다.
}
1. elision 암시적으로 생명주기를 주해하며 서로 다르다.

See also:

generics and closures

results matching ""

    No results matching ""