
33
1
장
타입
●
표현식의 일부로 만들 수 있어서 이름을 붙일 필요가 없다.
●
입력 매개변수는
|param1, param2|
와 같이 파이프 (
|
)로 묶는다 (매개변수 타입은 대부분 컴파일러가
자동으로 추론할 수 있다 ).
●
주변 환경을 캡처
capture
10
할 수 있다.
let amount_to_add = 3;
let add_n = |y| {
// 클로저에서 `amount_to_add`를 캡처한다.
y + amount_to_add
};
let z = add_n(5);
assert_eq!(z, 8);
캡처의 작동 방식을 간단히 표현하면 다음 코드와 같다. 우선 컴파일러는 람다 표현식에서 언
급하는 환경을 구성하는 모든 부분에 대해 일회용 내부 타입을 생성한다. 그러고 나서 클로저
가 생성되는 시점에 앞서 만들어 둔 일회용 타입의 인스턴스를 생성해 환경값을 보관한다. 그
러다 클로저가 호출되면 해당 인스턴스를 컨텍스트에 추가해서 사용한다.
let amount_to_add = 3;
// 환경을 캡처하는 클로저를 *간단히* 표현하면 다음과 같다.
struct InternalContext<'a> {
// 캡처한 변수에 대한 레퍼런스
amount_to_add: &'a u32,
}
impl<'a> InternalContext<'a> {
fn internal_op(&self, y: ...