闭包是rust的语法糖,rust会根据此生成对应的结构体,并对于是否捕获环境变量,是否修改环境变量,生成对应的fn/fnonce/fnmut的函数指针。

  1. 如果没有任何捕获变量,实现Fnonce。
  2. 如果由捕获变量,并且会对变量进行修改,则实现fnmut。
  3. 如果有捕获变量,并且不会对捕获变量进行修改,则实现fn。
  1. 编译器会把fnonce当成fn(T)函数指针去看待。
  2. fn/fnmut/fnonce这三者trait的关系是依次继承。他们正好对应于所有权三件套。

FnOnce

19.闭包的实现原理 - 图1

—>

19.闭包的实现原理 - 图2

FnMut

19.闭包的实现原理 - 图3

19.闭包的实现原理 - 图4

Fn

19.闭包的实现原理 - 图5

19.闭包的实现原理 - 图6