作为输入参数

虽然 Rust 大多会在不使用类型注解的情况下动态选择如何捕获变量,但在编写函数时不允许这种模糊性。当把闭包作为输入参数时,闭包的完整类型必须使用一些 trait 进行注解,并且它们由闭包如何处理捕获的值来决定。按限制递减的顺序,它们是

  • Fn:闭包通过引用 (&T) 使用捕获的值
  • FnMut:闭包通过可变引用 (&mut T) 使用捕获的值
  • FnOnce:闭包通过值 (T) 使用捕获的值

在逐个变量的基础上,编译器将以尽可能最不限制的方式捕获变量。

例如,考虑一个被注解为 FnOnce 的参数。这指定闭包 *可能* 通过 &T&mut TT 捕获,但编译器最终将根据捕获的变量在闭包中的使用方式进行选择。

这是因为如果可以移动,那么任何类型的借用也应该是可能的。请注意,反之则不然。如果参数被注解为 Fn,则不允许通过 &mut TT 捕获变量。但是,允许使用 &T

在下面的例子中,尝试交换 FnFnMutFnOnce 的用法,看看会发生什么

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

另请参阅

std::mem::drop, Fn, FnMut, 泛型, whereFnOnce