lifetime 표기는 처음 보면 외계어 같아: &'a str, fn foo<'a>(...). 문법을 해독해서 무섭지 않게 만들자.
'a 읽기
작은따옴표 뒤에 이름이 오면 lifetime 파라미터 야: 'a 는 'lifetime a' 라고 읽어. 타입의 T 처럼 제네릭 파라미터야 — '어떤 코드 영역' 을 가리키고, 컴파일러가 호출마다 구체적 영역을 채워. &'a str 은 'str 로의 참조, 영역 'a 동안 유효' 라는 뜻이야.
쓰기 전에 선언
타입 제네릭처럼, 쓰기 전에 꺾쇠 안에 lifetime 을 선언해: fn foo<'a>(x: &'a str). 꺾쇠 부분이 이름을 도입하고; &'a str 이 그걸 써. fn foo<T>(x: T) 랑 정확히 평행이야 — lifetime 은 타입이 아니라 영역에 대한 제네릭이야.
이름은 임의고, 관계가 전부야.
'a, 'b, 'life — 글자 자체는 아무 의미 없어. 중요한 건 어떤 참조들이 같은 lifetime 이름을 공유하느냐야, 그게 걔들의 유효성을 함께 묶거든.표기가 약속하는 것
두 파라미터를 같은 'a 로 쓰면 컴파일러한테 말하는 거야: '이것들을 한 영역 공유로 다뤄 — 출력은 두 입력이 둘 다 살아있는 동안만 유효해.' 어떤 수명도 늘리거나 줄이는 게 아니라; 컴파일러가 호출 지점마다 강제할 제약을 진술하는 거야.