소개
이 랩에서는 Rust 의 명시적 생명주기 어노테이션 (explicit lifetime annotations) 개념을 소개합니다. 이는 차용 검사기 (borrow checker) 가 참조 (reference) 의 유효성을 결정하는 데 사용됩니다.
참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어,
main.rs를 사용하고,rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.
명시적 어노테이션 (Explicit annotation)
차용 검사기 (borrow checker) 는 참조 (reference) 가 얼마나 오랫동안 유효해야 하는지 결정하기 위해 명시적 생명주기 어노테이션을 사용합니다. 생명주기가 생략되지 않는 경우, Rust 는 참조의 생명주기가 무엇이어야 하는지 결정하기 위해 명시적 어노테이션을 필요로 합니다. 명시적으로 생명주기를 어노테이션하는 구문은 다음과 같이 작은 따옴표 문자를 사용합니다.
foo<'a>
// `foo` 는 생명주기 매개변수 `'a` 를 가집니다.
클로저 (closure) 와 유사하게, 생명주기를 사용하려면 제네릭 (generics) 이 필요합니다. 또한, 이 생명주기 구문은 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;
// ERROR: `_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` 입니다.
}
요약
축하합니다! 명시적 어노테이션 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.