判别Fn、FnMut、FnOnce的标准
💡
原文中文,约3500字,阅读约需9分钟。
📝
内容提要
本文总结了如何判断使用Fn/FnMut/FnOnce的方法,需要考虑闭包捕获变量存储区的特性和闭包函数行为。所有权的捕获方式并非只有move关键字,需要注意误区。提供了解决方案,显式声明变量引用再move进去。
🎯
关键要点
- Fn、FnMut、FnOnce的特征分别是:FnOnce只能调用一次,FnMut可以多次调用且内部状态变化,Fn可以多次调用且内部状态不变。
- 判断使用Fn/FnMut/FnOnce的方法是先确定闭包捕获变量存储区的特性,再分析闭包函数行为。
- 闭包的捕获方式包括不可变引用、可变引用和所有权转移,影响闭包的特性。
- 没有move关键字时,捕获方式并不一定是引用捕获,可能是所有权捕获。
- move关键字的作用是强制所有权转移,但没有move关键字也可能会捕获所有权。
- 误区包括:认为没有move关键字就一定是引用捕获、认为有move关键字就一定是FnOnce、认为使用mut修饰就一定是FnMut等。
- Fn/FnMut/FnOnce与Copy/Clone无关,主要是调用方式的不同。
- 任何闭包都可以满足FnOnce限定,但Fn/FnMut必须具备Copy/Clone特质。
- 对于多个变量的捕获,可以显式声明变量的引用,再move进去以控制所有权转移。
🏷️
标签
➡️