As output parameters

인풋 타입으로 클로져를 파라미터로 사용하는 것이 가능한 것 처럼 아웃풋 파라미터로도 사용이 가능하다. 하지만 클로져 자체가 익명함수이기 때문에 반환 값으로 타입을 지정하기가 애매하다. 이럴땐 trait 로 리턴 값을 지정하면 된다.

Fn, FnMut, FnOncetrait 로 구현된 것이기 때문이다. 추후에 trait 챕터에서 자세하게 다룰 예정이니 눈으로 익히고 넘어가시길 바랍니다.

각 예제 마다 move 키워드를 사용했는데 왜 사용했을까?

move참조 개념과 관련이 있는데, 블록 안에서는 변수 사용이 가능하지만 블록 밖으로 나가면 해당 변수는 메모리에서 드랍된다. (드랍에 대해서도 추후 챕터에서 나온다.) 드랍된 변수는 더 이상 사용이 불가능하기 때문에 해당 closure는 변수 사용이 불가능하기에 컴파일 에러가 난다.


fn create_fn() -> impl Fn() {
    let fn_text = "fn_text".to_string();

    move || println!("this is a : {fn_text}")
}

fn create_fnmut() -> impl FnMut() {
    let fnmut_text = "fnmut_text".to_string();

    move || println!("this is a : {fnmut_text}")
}

fn create_fnonce() -> impl FnOnce() {
    let fnonce_text = "fnonce_text".to_string();

    move || println!("this is a {fnonce_text}")
}

fn main() {
	// return 값이 클로져이다. 클로져를 실행하자. 
    let fn_function = create_fn();
    fn_function();

    let mut fnmut_function = create_fnmut();
    fnmut_function();

    let fnonce_function = create_fnonce();
    fnonce_function();
}