소개
이 실습에서는 impl Trait과 유효한 트레이트 (Fn, FnMut, FnOnce) 를 지정하여 클로저를 입력 매개변수로 사용하고 출력 매개변수로 반환할 수 있다는 것을 배우게 됩니다. move 키워드는 모든 캡처가 값으로 발생하여 잘못된 참조를 방지하는 데 사용됩니다.
참고: 실습에서 파일 이름을 지정하지 않으면 원하는 파일 이름을 사용할 수 있습니다. 예를 들어
main.rs를 사용하고rustc main.rs && ./main으로 컴파일 및 실행할 수 있습니다.
출력 매개변수로서의 클로저
클로저를 입력 매개변수로 사용할 수 있다면, 출력 매개변수로서 클로저를 반환하는 것도 가능해야 합니다. 하지만 익명 클로저 유형은 정의상 알 수 없으므로, impl Trait를 사용하여 반환해야 합니다.
클로저를 반환하기 위한 유효한 트레이트는 다음과 같습니다.
FnFnMutFnOnce
이 외에도 모든 캡처가 값으로 발생한다는 것을 나타내는 move 키워드를 사용해야 합니다. 이는 참조에 의한 캡처는 함수가 종료되는 즉시 삭제되어 클로저에 유효하지 않은 참조를 남기기 때문입니다.
fn create_fn() -> impl Fn() {
let text = "Fn".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnmut() -> impl FnMut() {
let text = "FnMut".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnonce() -> impl FnOnce() {
let text = "FnOnce".to_owned();
move || println!("This is a: {}", text)
}
fn main() {
let fn_plain = create_fn();
let mut fn_mut = create_fnmut();
let fn_once = create_fnonce();
fn_plain();
fn_mut();
fn_once();
}
요약
축하합니다! 출력 매개변수 실습을 완료했습니다. LabEx 에서 더 많은 실습을 통해 기술을 향상시킬 수 있습니다.