NeuroWhAI의 잡블로그

[Rust] Lifetime의 한계 본문

개발 및 공부/언어

[Rust] Lifetime의 한계

NeuroWhAI 2018. 11. 18. 14:25 ...

출처 : https://doc.rust-lang.org/nomicon/lifetime-mismatch.html

struct Foo;

impl Foo {
    fn mutate_and_share(&mut self) -> &Self { &*self }
    fn share(&self) {}
}

fn main() {
    let mut foo = Foo;
    let loan: &Foo = foo.mutate_and_share();
    foo.share();
}

위 코드는 아래와 같은 에러를 뿜으며 컴파일이 안됩니다.

error[E0502]: cannot borrow `foo` as immutable because it is also borrowed as mutable
  --> src/main.rs:11:5
   |
10 |     let loan: &Foo = foo.mutate_and_share();
   |                      --- mutable borrow occurs here
11 |     foo.share();
   |     ^^^ immutable borrow occurs here
12 | }
   | - mutable borrow ends here

???

loan도 immutable이고 foo.share();도 immutable 레퍼런스를 요구하는데 무엇이 문제인가?

foo.mutate_and_share();가 mutable을 받는데 이 레퍼런스의 수명이 지나치게 길게 계산되어 생긴 문제입니다.

mutate_and_share의 &mut self와 &Self의 수명을 같은 것으로 계산하기 때문이죠.

여기서 반환값 &Self를 받는 녀석이 loan인데 이 녀석의 수명과 &mut self가 같아진다는 말입니다.

결국엔 foo.share();를 할때 loan이 살아있으니 mutate_and_share의 &mut self도 살아있는 것으로 취급되어 컴파일 에러가 발생하는 것입니다.

아래처럼 loan이 foo.share(); 전에 죽게 해줘야 mutable reference도 죽어 컴파일이 됩니다.

let mut foo = Foo;
{
    let loan: &Foo = foo.mutate_and_share();
}
foo.share();

더 나은 해결책이 있는지는 저도 모르겠습니다.

아직 Rust를 많이 써보질 않아서 이런 문제를 겪을 일이 얼마나 될지도 잘 모르겠는데 음...


Tag

0 Comments
댓글쓰기 폼