Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

클로저

클로저는 감싸고 있는 환경을 캡처할 수 있는 함수입니다. 예를 들어, x 변수를 캡처하는 클로저는 다음과 같습니다:

|val| val + x

클로저의 구문과 기능은 즉석에서 사용하기에 매우 편리합니다. 클로저를 호출하는 것은 함수를 호출하는 것과 똑같습니다. 하지만 입력 및 반환 타입은 추론될 수 있으며, 입력 변수 이름은 반드시 지정되어야 합니다.

클로저의 다른 특징들은 다음과 같습니다:

  • 입력 변수 주위에 () 대신 ||를 사용합니다.
  • 한 줄 표현식의 경우 본문 구분 기호({})는 선택 사항입니다 (그 외의 경우는 필수).
  • 외부 환경 변수를 캡처하는 능력.
fn main() {
    let outer_var = 42;

    // 일반 함수는 자신을 감싸고 있는 환경의 변수를 참조할 수 없습니다
// fn function(i: i32) -> i32 { i + outer_var }
// TODO: 위의 줄의 주석을 해제하고 컴파일 에러를 확인해 보세요. 컴파일러는
// 대신 클로저를 정의할 것을 제안합니다.

    // 클로저는 익명이며, 여기서는 참조에 바인딩하고 있습니다.
// 어노테이션은 함수의 어노테이션과 동일하지만 선택 사항이며,
// 본문을 감싸는 `{}` 역시 선택 사항입니다. 이 이름 없는 함수들은
// 적절하게 이름 붙여진 변수들에 할당됩니다.
    let closure_annotated = |i: i32| -> i32 { i + outer_var };
    let closure_inferred  = |i     |          i + outer_var  ;

    // 클로저를 호출합니다.
    println!("어노테이션된 클로저: {}", closure_annotated(1));
    println!("추론된 클로저: {}", closure_inferred(1));
    // 클로저의 타입이 한 번 추론되면, 다른 타입으로 다시 추론될 수 없습니다.
// println!("다른 타입으로 closure_inferred를 재사용할 수 없습니다: {}", closure_inferred(42i64));
// TODO: 위의 줄의 주석을 해제하고 컴파일 에러를 확인해 보세요.

    // 인자를 받지 않고 `i32`를 반환하는 클로저입니다.
// 반환 타입은 추론됩니다.
    let one = || 1;
    println!("1을 반환하는 클로저: {}", one());

}