Rust闭包类型

闭包是一种匿名函数,它可以赋值给变量也可以作为参数传递给其他函数,不同于函数的是,它允许捕获调用者作用域的值。

在Rust中闭包是具有类型的。Rust使用三种Fn Trait作为闭包类型。

根据闭包捕获变量的三种途径,恰好对应函数参数的三种传入方式:

  • 转移所有权

  • 可变借用

  • 不可变借用

因此对应了三种Fn Trait

  1. FnOnce。顾名思义,该类型闭包会拿走捕获变量的所有权,该闭包只能运行一次。

  2. FnMut,它以可变借用的方式捕获了环境中的值

  3. Fn,它以不可变借用的方式捕获环境中的值。

具体来讲,一个闭包实现了哪种Fn Trait取决于该闭包如何使用被捕获的变量,而不是取决于闭包如何使用他们。

在实际使用闭包过程中,如果不将其作为参数传递,或一种具体类型,其实无需关注闭包类型,只需要写闭包即可。

三种Fn的关系

实际上,一个闭包并不仅仅实现某一种 Fn 特征,规则如下:

  • 所有的闭包都自动实现了 FnOnce 特征,因此任何一个闭包都至少可以被调用一次

  • 没有移出所捕获变量的所有权的闭包自动实现了 FnMut 特征

  • 不需要对捕获变量进行改变的闭包自动实现了 Fn 特征

最后更新于

这有帮助吗?