
175
3
장
주요 개념
두 번째 방법은 비어휘 수명이 존재하기 때문에 첫 번째 방법보다 사용 빈도가 낮다. 공식적인
드롭 지점인 블록 끝에 다다르기 전에 레퍼런스가 더 이상 사용되지 않는다는 것을 컴파일러가
먼저 찾아내는 경우가 많기 때문이다. 그런데 이렇게 작은 코드 덩어리를 인위적인 블록을 둘
러싸는 식으로 처리할 일이 많다면, 그 부분을 메서드로 캡슐화하는 것이 바람직할 수도 있다.
문제가 간단한 경우에는 컴파일러가 제시하는 해결 방법이 도움 되지만, 코드가 점점 복잡해질
수록 컴파일러가 제시하는 방법이 그리 도움 되지 않고, 위배한 대여 규칙과 관련된 설명을 이
해하기 힘들어진다.
오류가 발생하는 코드
let x = Some(Rc::new(RefCell::new(Item { contents: 42 })));
// 함수를 다음과 같은 시그니처로 호출한다: `check_item(item: Option<&Item>)`
check_item(x.as_ref().map(|r| r.borrow().deref()));
error[E0515]: cannot return reference to temporary value
--> src/main.rs:293:35
|
293 | check_item(x.as_ref().map(|r| r.borrow().deref()));
| ----------^^^^^^^^ ...