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.