判别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进去以控制所有权转移。
➡️

继续阅读