Rust 함수는 단순한데, 새내기를 넘어뜨리는 아이디어 하나가 있어: Rust 는 표현식 기반 언어야. 거의 모든 게 값을 만들고, 너는 그걸 계속 기대게 돼.
함수 정의
fn add(a: i32, b: i32) -> i32 { a + b }. 파라미터 타입은 항상 필수야 — Rust 는 함수 경계를 넘어 추측하는 법이 없어. 반환 타입은 -> 뒤에 와. return 키워드도 없고 a + b 에 세미콜론도 없는 거 봐: 블록의 마지막 표현식이 곧 블록의 값이야.
문 vs 표현식
문(statement) 은 뭔가를 해 (let x = 5;); 표현식은 값으로 평가돼 (5 + 5, 함수 호출, if, 심지어 { } 블록까지). 세미콜론을 붙이면 표현식이 문으로 바뀌고 그 값이 버려져. 그 세미콜론 하나가 값을 반환하느냐 () — 빈 'unit' 타입 — 를 반환하느냐의 차이야.
값을 반환하는 제어 흐름
if 가 표현식이라서 let n = if cond { 1 } else { 2 }; 가 돼. loop 는 break value 로 값을 반환할 수 있고. 그리고 일꾼은 for x in collection 이야 — Rust 의 for 는 항상 이터레이터를 돌지 수동 인덱스를 안 써서, off-by-one 버그를 근원에서 없애.
() 를 찾았다는 타입 에러가 떠 — 첫 주의 전형적인 혼란이야.왜 인덱싱 대신 for-in 이냐
수동 인덱스 루프가 버퍼 오버런이랑 off-by-one 에러가 번식하는 자리야. Rust 의 for item in &items 는 각 원소를 직접 건네주고, 이터레이터가 언제 멈출지 알고, 틀릴 인덱스 자체가 없어.