闭包
概述
闭包只是定义了代码,存储代码,并不是执行。 闭包(Closure)也叫Lambda表达式或匿名函数。 不像普通函数,闭包可以对参数和返回类型进行推断,大多数时候都不需要写出来。 闭包是一种匿名类型,一旦声明,就会产生一个新的类型,但这个类型无法被其它地方使用。这个类型就像一个结构体,会包含所有捕获的变量。
创建闭包
格式
// fn 闭包
let fn = |参数列表| -> 返回类型 {代码段};
// FnMut 闭包
let mut fn = |参数列表| -> 返回类型 {代码段};
// FnOnce 闭包,move 可有可无,如果函数内发生所有权移交,也会触发
let fn = move |参数列表| -> 返回类型 {代码段};
// 无参闭包
let res = {
// 代码段
// 返回值
};
// 立即执行闭包
(|参数列表| -> 返回值 {代码段})(传入参数)合法的定义
分类
闭包的类型 在Rust语言中,闭包是一种特殊的类型,被称为Fn、FnMut和FnOnce。这些类型用于区分闭包的捕获方式和参数类型。
解释
受限程度
不同点
它们的调用方法分别采用&self、&mut self和self,这意味着Fn对其捕获具有不可变的访问权限,FnMut获得可变的访问权限,FnOnce可以获得所有权。 Fn和FnMut类型的闭包可以执行多次,而FnOnce类型的闭包只能执行一次。
move 关键字
特点
注意
参数列表可省略类型,但必须发生调用,否则编译报错。 返回值可为空,会自动推导。
闭包参数
Fn
Fn 可以通过不可变的引用捕获变量。
FnMut
可以通过可变引用捕获。
FnOnce
案例
简单案例
FnOnce闭包案例
Last updated