闭包

Rust 中的闭包(closure),也叫做 lambda 表达式或者 lambda,是一类能够捕获周围 作用域中变量的函数。例如,一个可以捕获 x 变量的闭包如下:

  1. |val| val + x

它们的语法和能力使它们在临时(on the fly)使用时相当方便。调用一个闭包和调用一个 函数完全相同,不过调用闭包时,输入和返回类型两者都可以自动推导,而输入变量 名必须指明。

其他的特点包括:

  • 声明时使用 || 替代 () 将输入参数括起来。
  • 函数体定界符({})对于单个表达式是可选的,其他情况必须加上。
  • 有能力捕获外部环境的变量。
  1. fn main() {
  2. // 通过闭包和函数分别实现自增。
  3. // 译注:下面这行是使用函数的实现
  4. fn function (i: i32) -> i32 { i + 1 }
  5. // 闭包是匿名的,这里我们将它们绑定到引用。
  6. // 类型标注和函数的一样,不过类型标注和使用 `{}` 来围住函数体都是可选的。
  7. // 这些匿名函数(nameless function)被赋值给合适地命名的变量。
  8. let closure_annotated = |i: i32| -> i32 { i + 1 };
  9. let closure_inferred = |i | i + 1 ;
  10. // 译注:将闭包绑定到引用的说法可能不准。
  11. // 据[语言参考](https://doc.rust-lang.org/beta/reference/types.html#closure-types)
  12. // 闭包表达式产生的类型就是 “闭包类型”,不属于引用类型,而且确实无法对上面两个
  13. // `closure_xxx` 变量解引用。
  14. let i = 1;
  15. // 调用函数和闭包。
  16. println!("function: {}", function(i));
  17. println!("closure_annotated: {}", closure_annotated(i));
  18. println!("closure_inferred: {}", closure_inferred(i));
  19. // 没有参数的闭包,返回一个 `i32` 类型。
  20. // 返回类型是自动推导的。
  21. let one = || 1;
  22. println!("closure returning one: {}", one());
  23. }