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