[Rust] lifetime과 &mut self

undefcat·2022년 11월 8일
0

rust

목록 보기
5/6
post-thumbnail

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 코드를 작성할 수 있을 것이다.

profile
undefined cat

0개의 댓글