Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

명시적 어노테이션

빌림 검사기는 참조가 얼마나 오래 유효해야 하는지 결정하기 위해 명시적 라이프타임 어노테이션을 사용합니다. 라이프타임이 생략(elided)1되지 않는 경우, Rust는 참조의 라이프타임이 어떻게 되어야 하는지 결정하기 위해 명시적인 어노테이션을 요구합니다. 라이프타임을 명시적으로 어노테이션하는 구문은 다음과 같이 아포스트로피 문자를 사용합니다:

foo<'a>
// `foo`는 라이프타임 파라미터 `'a`를 가집니다

클로저와 유사하게, 라이프타임을 사용하려면 제네릭이 필요합니다. 또한, 이 라이프타임 구문은 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는 {}이고 y는 {}입니다", x, y);
}

// 인자를 받지 않지만 라이프타임 파라미터 `'a`를 가진 함수입니다.
fn failed_borrow<'a>() {
    let _x = 12;

    // 에러: `_x`의 수명이 충분히 길지 않습니다
    let _y: &'a i32 = &_x;
    // 함수 내부에서 라이프타임 `'a`를 명시적 타입 어노테이션으로 사용하려고 하면
    // 실패합니다. `&_x`의 라이프타임이 `_y`의 라이프타임보다 짧기 때문입니다.
    // 짧은 라이프타임은 더 긴 라이프타임으로 강제 변환될 수 없습니다.
}

fn main() {
    // 아래에서 빌려올 변수들을 생성합니다.
    let (four, nine) = (4, 9);

    // 두 변수의 빌림(`&`)이 함수로 전달됩니다.
    print_refs(&four, &nine);
    // 빌려온 모든 입력은 빌리는 주체보다 오래 살아야 합니다.
    // 다시 말해, `four`와 `nine`의 라이프타임은
    // `print_refs`의 라이프타임보다 길어야 합니다.

    failed_borrow();
    // `failed_borrow`는 `'a`가 함수의 라이프타임보다 길어야 함을 강제하는
// 참조를 포함하지 않지만, `'a`는 더 깁니다.
// 라이프타임이 결코 제약되지 않으므로, 이는 `'static`으로 기본 설정됩니다.
}

참고:

제네릭클로저


  1. 생략(elision)은 암시적으로 라이프타임을 어노테이션하므로 다릅니다.