作为输出参数

闭包作为输入参数是可能的,所以返回闭包作为输出参数(output parameter)也应该是可能的。然而返回闭包类型会有问题,因为目前 Rust 只支持返回具体(非泛型)的类型。按照定义,匿名的闭包的类型是未知的,所以只有使用impl Trait才能返回一个闭包。

返回闭包的有效特征是:

  • Fn
  • FnMut
  • FnOnce

除此之外,还必须使用 move 关键字,它表明所有的捕获都是通过值进行的。这是必须的,因为在函数退出时,任何通过引用的捕获都被丢弃,在闭包中留下无效的引用。

  1. fn create_fn() -> impl Fn() {
  2. let text = "Fn".to_owned();
  3. move || println!("This is a: {}", text)
  4. }
  5. fn create_fnmut() -> impl FnMut() {
  6. let text = "FnMut".to_owned();
  7. move || println!("This is a: {}", text)
  8. }
  9. fn create_fnonce() -> impl FnOnce() {
  10. let text = "FnOnce".to_owned();
  11. move || println!("This is a: {}", text)
  12. }
  13. fn main() {
  14. let fn_plain = create_fn();
  15. let mut fn_mut = create_fnmut();
  16. let fn_once = create_fnonce();
  17. fn_plain();
  18. fn_mut();
  19. fn_once();
  20. }

参见:

Fn, FnMut, 泛型impl Trait.