作为输入参数
虽然 Rust 大多会在不使用类型注解的情况下动态选择如何捕获变量,但在编写函数时不允许这种模糊性。当把闭包作为输入参数时,闭包的完整类型必须使用一些 trait
进行注解,并且它们由闭包如何处理捕获的值来决定。按限制递减的顺序,它们是
Fn
:闭包通过引用 (&T
) 使用捕获的值FnMut
:闭包通过可变引用 (&mut T
) 使用捕获的值FnOnce
:闭包通过值 (T
) 使用捕获的值
在逐个变量的基础上,编译器将以尽可能最不限制的方式捕获变量。
例如,考虑一个被注解为 FnOnce
的参数。这指定闭包 *可能* 通过 &T
、&mut T
或 T
捕获,但编译器最终将根据捕获的变量在闭包中的使用方式进行选择。
这是因为如果可以移动,那么任何类型的借用也应该是可能的。请注意,反之则不然。如果参数被注解为 Fn
,则不允许通过 &mut T
或 T
捕获变量。但是,允许使用 &T
。
在下面的例子中,尝试交换 Fn
、FnMut
和 FnOnce
的用法,看看会发生什么