수명

Lifetime

참조가 가리키는 값보다 오래 남지 않도록 범위의 관계를 검사합니다.

···
html
<div class="r2 lifetime" data-step="0"><div class="r2-head">REFERENCE LIFETIME<span class="r2-live"></span></div><div class="r2-stage"><div class="r2-time-head"><span>start</span><span>time →</span><span>end</span></div><div class="r2-time-bar owner">value lives</div><div class="r2-time-bar ref">reference</div><div class="r2-time-bar invalid">invalid extension</div></div><div class="r2-foot"><span class="r2-caption"></span><span class="r2-progress"></span></div></div>
css
.r2{width:min(95vw,730px);height:min(92vh,330px);padding:clamp(9px,2.5vmin,17px);display:flex;flex-direction:column;gap:7px;border:1px solid var(--line);border-radius:13px;background:var(--surface);color:var(--fg);font:500 clamp(12px,3.4vmin,16px)/1.25 var(--font-sans,sans-serif)}.r2 *{box-sizing:border-box}.r2-head{display:flex;justify-content:space-between;align-items:center;min-height:17px;color:var(--accent);font-size:12px;font-weight:700;letter-spacing:.03em}.r2-live{height:7px;width:7px;border-radius:50%;background:var(--accent);animation:r2beat 1.1s infinite}@keyframes r2beat{50%{opacity:.25}}.r2-stage{flex:1;min-height:0;position:relative;overflow:hidden}.r2-foot{min-height:27px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px}.r2-caption{min-width:0}.r2-progress{flex:none;color:var(--accent);font:600 12px ui-monospace,monospace}.lifetime .r2-stage{display:flex;flex-direction:column;justify-content:center;gap:5px}.r2-time-head{display:flex;justify-content:space-between;color:var(--muted);font-size:12px}.r2-time-bar{height:24px;padding:3px 8px;border-radius:5px;font-size:12px;white-space:nowrap;transition:width .35s,opacity .35s}.r2-time-bar.owner{width:72%;border:1px solid var(--accent);background:color-mix(in srgb,var(--accent) 18%,var(--surface))}.r2-time-bar.ref{width:56%;margin-left:12%;border:1px solid var(--accent-2);background:color-mix(in srgb,var(--accent-2) 18%,var(--surface))}.r2-time-bar.invalid{width:45%;margin-left:55%;border:1px dashed var(--accent-3);color:var(--accent-3);opacity:.2}.lifetime[data-step="1"] .r2-time-bar.ref{width:80%}.lifetime[data-step="1"] .r2-time-bar.invalid{opacity:1}.lifetime[data-step="2"] .r2-time-bar.ref{width:56%}.lifetime[data-step="2"] .r2-time-bar.invalid{opacity:.15}
js
const root=document.querySelector('.r2'),caption=root.querySelector('.r2-caption'),progress=root.querySelector('.r2-progress'),labels=["Value owns the valid range","Reference extends too far","Shorten the reference range"];let step=0;function advance(){root.dataset.step=String(step);caption.textContent=labels[step];progress.textContent=(step+1)+' / '+labels.length;step=(step+1)%labels.length}advance();const timer=setInterval(advance,1000);root.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})

러스트의 수명은 참조가 유효한 범위의 관계를 표현합니다. 컴파일러는 참조가 가리키는 값이 먼저 사라질 수 있으면 그 참조 사용을 거부합니다. 수명 표기 자체가 값을 더 오래 살게 하지는 않습니다.

데모에서 값의 막대는 참조보다 길어야 합니다. 참조를 값의 끝 너머로 늘리면 빨간 구간이 드러납니다. 함수가 여러 참조 중 어떤 것과 결과 참조를 연결하는지 모호할 때 수명 매개변수를 명시합니다.

언제 쓰나

참조를 반환하는 함수나 여러 참조를 연결하는 구조체를 설계할 때 사용합니다.

페이지로 열기 ↗