输入函数

既然闭包可以作为参数,你很可能想知道函数是否也可以呢。确实可以!如果你声明一个 接受闭包作为参数的函数,那么任何满足该闭包的 trait 约束的函数都可以作为其参数。

  1. // 定义一个函数,可以接受一个由 `Fn` 限定的泛型 `F` 参数并调用它。
  2. fn call_me<F: Fn()>(f: F) {
  3. f()
  4. }
  5. // 定义一个满足 `Fn` 约束的封装函数(wrapper function)。
  6. fn function() {
  7. println!("I'm a function!");
  8. }
  9. fn main() {
  10. // 定义一个满足 `Fn` 约束的闭包。
  11. let closure = || println!("I'm a closure!");
  12. call_me(closure);
  13. call_me(function);
  14. }

多说一句,FnFnMutFnOnce 这些 trait 明确了闭包如何从周围的作用域 中捕获变量。

参见:

Fn, FnMut, 和 FnOnce