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.

See also:

Fn, FnMut, and FnOnce

results matching ""

    No results matching ""