8.2.5 As output parameters
클로저를 입력 매개체로 사용가능하고, 산출 매개체로도 클로저를 사용할 수 있어야 한다. 하지만, 반환되는 클로저 타입은 문제여지가 있어 Rust는 현재 오직 구체화 된(비-제네릭)타입만 지원한다. 익명 클로저의 정의에 따라 타입은 알 수 없고, 반환되는 클로저는 오직 이를 구체화해야 가능하다. 이는 박싱을 통해 가능하다.
반환으로 유효한 trait들은 이전에 다뤘던 내용과는 약간 다르다:
Fn
: 일반FnMut
: 일반FnOnce
: 여기에는 몇 가지 특이한 점들이 있어서 현재는FnBox
타입이 필요하고 안정적이지 않다. 이는 향후 변경 예정되어 있다.
이하에서, move
키워드가 반드시 사용되어 모든 캡처가 값에 의한다는 신호를 준다. 이게 필요한 이유는 어떤 참조에 의한 캡처도 함수가 종료되는 시점에 드랍되고, 유효하지 않은 참조를 클로저에 남기기 때문이다.
fn create_fn() -> Box<Fn()> { let text = "Fn".to_owned(); Box::new(move || println!("This is a: {}", text)) } fn create_fnmut() -> Box<FnMut()> { let text = "FnMut".to_owned(); Box::new(move || println!("This is a: {}", text)) } fn main() { let fn_plain = create_fn(); let mut fn_mut = create_fnmut(); fn_plain(); fn_mut(); }