Updated:

1 minute read

개요

  • 변수에 저장하거나 다른 함수에 인자로 넘길 수 있는 익명 함수
  • 호출되는 스코프로부터 변수 캡처 가능
  • 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