클로저는 정의된 스코프의 변수를 캡처 할 수 있는 익명 함수야. 이터레이터 체인의 접착제고, 함수형 스타일 Rust 가 그렇게 깔끔하게 읽히는 이유야.
문법
클로저는 |인자| 본문 이야: |x| x + 1 은 x 를 받아 x + 1 을 반환해. 함수와 달리 주변 스코프의 변수를 파라미터로 받지 않고 쓸 수 있어 — 캡처 하거든. 컴파일러가 쓰는 방식에서 인자랑 반환 타입을 추론해.
캡처하는 세 방법
클로저는 각 변수를 가능한 가장 덜 제약적인 방식으로 캡처해: 읽기만 하면 불변 참조로, 수정하면 가변 참조로, 소유해야 하면 값으로. 이 세 모드가 세 trait 에 대응해 — Fn (캡처 읽음), FnMut (캡처 변형), FnOnce (캡처 소비, 한 번 호출 가능). 이름 붙일 일은 드물어; 컴파일러가 고르고, 클로저를 받는 함수가 뭘 받을지 선언해.
Fn trait 은 캡처한 변수에 적용된 소유권 규칙이야. 읽기 전용 캡처는 공유 borrow (
Fn); 변형 캡처는 가변 borrow (FnMut); 소비 캡처는 move (FnOnce). Borrowing 트랙의 그 aliasing 로직이 클로저가 어느 trait 을 구현할지 정해.move 클로저
클로저 앞에 move 를 붙이면 캡처하는 모든 걸 소유하게 강제해: move |x| x + base. 클로저가 현재 스코프보다 오래 살 때 필수야 — 스레드에 넘기거나, 반환하거나, 저장할 때. Concurrency 트랙이 데이터를 스레드에 안전하게 건네려고 move 클로저에 기대.