Notice
Recent Posts
Recent Comments
NeuroWhAI의 잡블로그
[Rust] Lifetime의 한계 본문
출처 : 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를 많이 써보질 않아서 이런 문제를 겪을 일이 얼마나 될지도 잘 모르겠는데 음...
'개발 및 공부 > 언어' 카테고리의 다른 글
[Rust] wrapping으로 오버플로/언더플로 에러 피하기 (0) | 2018.12.19 |
---|---|
[Rust] enum 사용시 주의 사항 (0) | 2018.12.06 |
[C++] Designated initializers (0) | 2018.11.17 |
[C++] get/return_temporary_buffer, uninitialized_*에 대하여 (0) | 2018.11.14 |
[Rust] Send와 Sync (0) | 2018.11.12 |
Comments