Rust
클로저
va95
2025. 1. 27. 23:26
일급 객체(정의 까먹어서 다시 씀..)
- 변수에 할당(assignment)할 수 있다.
- 다른 함수를 인자(argument)로 전달 받는다.
- 다른 함수의 결과로서 리턴될 수 있다.
클로저 할당 방식
let expensive_closure = |num| {
println!("calculating slowly...");
thread::sleep(Duration::from_secs(2));
num
};
타입 어노테이션 생략 가능
(마지막처럼 표현식 1개로 구성된 경우, 중괄호도 생략 가능)
fn add_one_v1 (x: u32) -> u32 { x + 1 }
let add_one_v2 = |x: u32| -> u32 { x + 1 };
let add_one_v3 = |x| { x + 1 };
let add_one_v4 = |x| x + 1 ;
클로저 캡쳐
- 소유권 받기, 불변으로 빌려오기, 가변으로 빌려오기.
- FnOnce 는 클로저의 환경으로 알고 있는, 그것을 둘러싼 환경에서 캡처한 변수 들을 소비합니다. 캡처한 변수를 소비하기 위해, 클로저는 이 변수의 소유권을 가져야 하고 그것이 정의될 때 클로저 안으로 그것들을 옮겨와야 합니다. 이름의 일부인 Once 는 그 클로저가 동일한 변수들에 대해 한번이상 소유권을 얻을수 없다는 사실을 의미하며, 그래서 한 번만 호출 될 수 있습니다.
- Fn 은 그 환경으로 부터 값들을 불변으로 빌려 옵니다.
- FnMut 값들을 가변으로 빌려오기 때문에 그 환경을 변경할 수 있습니다.
멀티 쓰레딩 상황에서 유용한 move(소유권 받기)
fn main() {
let x = vec![1, 2, 3];
let equal_to_x = move |z| z == x;
println!("can't use x here: {:?}", x);
let y = vec![1, 2, 3];
assert!(equal_to_x(y));
}