[Rust] 클로저
Updated:
개요
- 변수에 저장하거나 다른 함수에 인자로 넘길 수 있는 익명 함수
- 호출되는 스코프로부터 변수 캡처 가능
- move
- 소유권을 갖도록 강제
let equal_to_x = move |z| z == x;
- 클로저 반환
- Box
이용
- 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
-