라이프타임 점검

라이프타임 참조 유효성

반환 참조, 구조체 필드 참조, elision 실패 지점에서는 어떤 입력 참조와 출력 참조의 생존 범위가 연결되는지 명시해야 한다.

01

참조 출처 찾기

반환 참조가 매개변수 중 어느 값에서 나온 것인지 확인한다.

origin
02

관계 이름 붙이기

x: &'a str, y: &'a str -> &'a str처럼 출력이 입력보다 오래 살 수 없음을 표현한다.

constraint
03

구조체 보관

struct가 참조를 필드로 들고 있으면 인스턴스도 그 참조보다 오래 살 수 없다.

struct lifetime
04

소유로 전환

관계가 복잡하거나 반환 출처가 로컬이면 String/Arc처럼 소유 타입으로 바꾼다.

owning escape
return local ref
함수 안 지역 변수 참조 반환 지역 값은 함수 종료와 함께 사라지므로 참조를 반환할 수 없다.
dangling
two inputs
반환이 x인지 y인지 컴파일러가 모름 longest 함수처럼 두 입력과 출력의 라이프타임 관계를 같은 이름으로 묶는다.
explicit needed
struct field
참조 필드가 인스턴스보다 짧게 삶 struct ImportantExcerpt<'a> { part: &'a str }처럼 타입에 관계를 담는다.
stored reference
elision limit
규칙으로 추론 불가능 입력 라이프타임이 하나가 아니고 self 규칙도 없으면 명시가 필요하다.
compiler asks

라이프타임 참조 유효성 선택 기준

빌려도 되는가 호출자가 값을 소유하고 함수가 잠깐 읽기만 하면 참조와 라이프타임이 맞다.
저장해야 하나 구조체가 오래 보관하면 소유 타입으로 바꾸는 편이 단순할 수 있다.
오류 읽기 borrowed value does not live long enough는 관계가 아니라 실제 값 수명이 짧다는 신호다.