Rust:关于闭包的一点研究
闭包有三种类型,Fn、FnMut、FnOnce,其中 Fn 继承了 FnMut,FnMut 继承了 FnOnce,Fn 类型以不可变引用的形式捕获变量,不会修改环境变量且可以多次执行;FnMut 以可变引用的形式捕获变量,可以修改外部变量且可多次执行;FnOnce 捕获变量本身,只可以执行一次。
闭包还有一个关键字 move,可以将变量移动到闭包中,如果变量实现了 Copy trait,则执行 copy,否则不执行。下面举例来说明各种情况
1、如果闭包未捕获任何外部变量,则自动实现 Fn,闭包 c 可以多次执行
2、如果闭包捕获了 Copy 语义的不可变变量,则不管是否使用 move 关键字,都自动实现 Fn,闭包 c 可以多次执行
3、如果闭包捕获了 Copy 语义的可修改变量并在闭包内部进行了修改,且没有使用 move 关键字,则闭包实现了 FnMut,可以多次调用,闭包内外操作的是同一个变量
4、如果闭包捕获了 Copy 语义的可修改变量并在闭包内部进行了修改,且使用 move 关键字,则闭包实现了 FnMut,可以多次调用,闭包内的变量是外部变量的一个拷贝,对闭包的操作,不影响外部变量
5、如果闭包捕获了移动语义的变量,则自动实现 FnOnce
6、如果闭包捕获了移动语义的变量,且在闭包内以引用(&)的形式使用,则闭包实现了 Fn,可以多次调用
7、如果闭包捕获了移动语义的可变变量,且闭包内部进行了可变操作,且没有使用 move 关键字,则实现了 FnMut,可以多次执行,且闭包内外操作的是同一个变量
8、如果闭包捕获了移动语义的可变变量,且闭包内部进行了可变操作,且使用 move 关键字,则实现了 FnMut,可以多次执行,如果再次操作外部变量,会报错
以上是对闭包的一点小总结,欢迎大家交流讨论。
版权声明: 本文为 InfoQ 作者【Microwood】的原创文章。
原文链接:【http://xie.infoq.cn/article/7d2720e97d8d5e80a62ab9a15】。文章转载请联系作者。
评论