Rust에서 lifetime은 레퍼런스의 유효 범위를 지정해주는 역할을 한다. 그렇다면 아래와 같은 코드를 보자.
struct Foo<'a> {
foo: &'a i32,
}
impl<'a> Foo<'a> {
fn new() -> Self {
Self {
foo: &10,
}
}
fn borrow(&'a mut self) {
// ...
}
}
fn main() {
let mut foo = Foo::new();
foo.borrow();
foo.borrow(); // [E0499]
}
두 번 borrow()
를 호출하는 코드를 작성하면, 컴파일 에러가 발생한다. 이는 mutable reference를 두 번 이상 borrow
하는 경우 발생하는 에러인데 이 에러 자체는 이해하기가 쉽다.
그런데 왜 발생했는가? 'a
의 lifetime이 Foo
와 함께하기 때문이다. 즉, Foo
인스턴스의 생애주기동안 'a
lifetime도 함께하기 때문에, 그냥 당연하게 E0499 에러가 발생한 것이다.
let mut value = 10;
let value_mut = &mut value;
let value_mut2 = &mut value; // [E0499]
*value_mut = 20;
이건 위의 예제와 같은 경우인데, 사실 Rust에서 모든 레퍼런스는 lifetime parameter를 갖는다. 다만 일반적인 경우엔 생략가능한 것이다. 위의 경우도 value
에 대해 같은 lifetime을 갖고 있기 때문에 에러가 발생한 것이다.
즉, struct
의 lifetime이 메서드에서의 &mut self
와 같다면, struct
생애 주기에서 딱 한 번만 호출 가능하게 되는 결과가 되는 것이다.
결국 borrow에 대해서 생략된 lifetime parameter를 인지하고 있어야 좀 더 수월하게 Rust 코드를 작성할 수 있을 것이다.