1 분 소요

개요

  • 변수에 저장하거나 다른 함수에 인자로 넘길 수 있는 익명 함수
  • 호출되는 스코프로부터 변수 캡처 가능
  • move
    • 소유권을 갖도록 강제
    • let equal_to_x = move |z| z == x;
  • 클로저 반환
    • Box 이용


Fn 트레잇

  • FnOnce
    • 캡쳐한 변수의 소유권을 가져옴
    • 소유권을 가져오므로 한번만 호출 가능
  • Fn
    • 캡쳐한 변수를 불변으로 빌림
  • FnMut
    • 캡쳐한 변수를 가변으로 빌림
    • 값 변경 가능


예제

  • 코드

        struct Test<T>
        where
            T: Fn(i32) -> i32,
        {
            f: T,
        }

        impl<T> Test<T>
        where
            T: Fn(i32) -> i32,
        {
            fn run(&self, value: i32) -> i32 {
                (self.f)(value)
            }
        }

        fn main() {
            let f = |i| i + 1;
            println!("1 : {}", f(1));

            let f = |mut i| {
                i += 1;
                i
            };
            println!("2.1 : {}", f(1));
            println!("2.2 : {}", f(2));

            let v = vec![1, 2, 3];
            let f = || v[0];
            println!("3 : {}, {}", v[0], f());

            let v = vec![1, 2, 3];
            let f = move || v[0];
            //println!("4 : {}, {}", v[0], f());
            println!("4 : {}", f());

            let f = |i| i + 1;
            println!("5 : {}", Test { f: f }.run(1));
        }
  • 실행 결과

        1 : 2
        2.1 : 2
        2.2 : 3
        3 : 1, 1
        4 : 1
        5 : 2


예제 - 클로저 반환

  • 코드

        fn func() -> Box<dyn Fn(i32) -> String> {
            Box::new(|x| x.to_string())
        }

        fn main() {
            println!("{}", func()(3));
        }
  • 실행 결과

        3