闭包

概述

闭包只是定义了代码,存储代码,并不是执行。 闭包(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