8.2.4 Input functions
클로저가 인자로 사용될 수 있기에, 함수도 가능한지 궁금해 할 수 있을 것이다. 그리고 실제로 가능하다! 하지만, 함수는 절대로 변수를 캡쳐할 수 없고, 클로저가 더 유연하다. 따라서 클로저를 인자로 취하는 함수는, 어떤 함수든 클로저의 trait 바인딩을 만족할 수 있다면 인자로 사용할 수 있다.
// 제네릭 `F`를 인자로 취하는 함수를 정의하고
// `Fn`으로 바인딩하고 그를 호출한다.
fn call_function<F: Fn()>(f: F) {
f()
}
// 입력으로 사용될 `Fn` 바인딩을 만족시키는 함수.
fn print() {
println!("I'm a function!")
}
fn main() {
// `Fn` 바인딩을 만족시키는 클로저를 정의.
let closure = || println!("I'm a closure!");
call_function(closure);
call_function(print);
}추가로 주목할 점은 Fn, FnMut, FnOnce trait은 클로저가 포함되는 범위에서 변수를 캡쳐하는 방법을 지정한다.
As an additional note, the Fn, FnMut, and FnOnce traits dictate how
a closure captures variables from the enclosing scope.