Rust let chains

러스트 let 조건 연결

Chained let conditions in if expressions pass earlier bindings into later conditions.

···
html
<div class="demo code"><div class="heading"><strong>LET CHAIN</strong><span class="pulse"></span></div><div class="scene"><div class="cell" data-cell="0"><span class="index">01</span><span class="value">input = Some(7)</span></div><div class="cell" data-cell="1"><span class="index">02</span><span class="value">if let Some(n) = input</span></div><div class="cell" data-cell="2"><span class="index">03</span><span class="value">&amp;&amp; n &gt; 5</span></div><div class="cell" data-cell="3"><span class="index">04</span><span class="value">run body</span></div></div><div class="caption" id="caption"></div><div class="ticks"><i></i><i></i><i></i><i></i></div></div>
css
.demo{width:min(95vw,760px);height:min(91vh,330px);padding:clamp(9px,2.5vmin,18px);display:flex;flex-direction:column;gap:clamp(6px,1.7vmin,12px);border:1px solid var(--line);border-radius:13px;background:var(--surface);font:500 clamp(12px,3.4vmin,16px)/1.25 var(--font-sans,-apple-system),sans-serif}
.heading{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:19px}.heading strong{color:var(--accent);font-size:1em;letter-spacing:.02em}.pulse{width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 5px color-mix(in srgb,var(--accent) 14%,transparent);animation:beat 1.4s infinite}@keyframes beat{50%{box-shadow:0 0 0 9px transparent}}
.scene{flex:1;min-height:0;display:flex;align-items:stretch;justify-content:center;gap:clamp(5px,1.5vmin,11px)}.cell{position:relative;min-width:0;flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:5px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--muted);text-align:center;transition:transform .3s,border-color .3s,background .3s,opacity .3s}.cell .value{overflow-wrap:anywhere}.index{font:600 12px ui-monospace,monospace;opacity:.62}.cell.active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 13%,var(--surface));color:var(--fg);transform:translateY(-4px);box-shadow:0 6px 0 color-mix(in srgb,var(--accent) 18%,transparent)}
.rail .cell:not(:last-child):after{content:'›';position:absolute;right:-10px;top:40%;z-index:2;color:var(--accent);font:700 18px sans-serif}
.caption{color:var(--fg);min-height:2.5em;display:flex;align-items:center;justify-content:center;text-align:center}.ticks{display:flex;justify-content:center;gap:4px}.ticks i{display:block;width:15px;height:3px;background:var(--line);border-radius:3px}.ticks i.active{background:var(--accent)}
.split .scene{gap:12px}.split .cell{position:relative}.split .cell:first-child{border-color:var(--accent-2)}.split .cell:last-child{border-color:var(--accent-3)}
.grid .scene{display:grid;grid-template-columns:repeat(2,1fr);grid-auto-rows:1fr}.grid .cell.active{transform:scale(1.025)}
.code .scene{flex-direction:column;gap:4px}.code .cell{flex:1;align-items:flex-start;text-align:left;padding-left:12px;font:500 clamp(12px,3.4vmin,16px)/1.2 ui-monospace,monospace}.code .cell.active{transform:translateX(5px)}.code .index{display:none}
.stack .scene{flex-direction:column;gap:4px}.stack .cell{flex:1;flex-direction:row;gap:12px;justify-content:flex-start;padding-left:12px}.stack .cell.active{transform:translateX(5px)}
js
const moments=[{"focus":0,"label":"Read an optional value"},{"focus":1,"label":"Pattern binds n = 7"},{"focus":2,"label":"Next condition uses n"},{"focus":3,"label":"Both checks pass"}];let n=0;const cells=[...document.querySelectorAll('.cell')],ticks=[...document.querySelectorAll('.ticks i')],caption=document.getElementById('caption');function show(){const m=moments[n];cells.forEach((el,i)=>{el.classList.toggle('active',i===m.focus);if(m.cells?.[i]!==undefined)el.querySelector('.value').textContent=m.cells[i]});ticks.forEach((el,i)=>el.classList.toggle('active',i===n));caption.textContent=m.label;n=(n+1)%moments.length}show();let timer=setInterval(show,1050);document.querySelector('.demo').addEventListener('pointerdown',()=>{clearInterval(timer);show()})

Let chains join a pattern match and further conditions with && inside an if expression. A successful earlier pattern binds a name that later conditions can use.

The demo opens a Some value before testing its number. A failed pattern short-circuits the later condition.

When to use

Use it to combine optional-value matching with a further check without nested if blocks.

Open as page ↗