每日一 R「13」数据结构(四)闭包
今天我们来学习数据结构系列中的最后一讲内容,闭包。闭包是函数编程语言中非常重要的一个工具,它可以作为参数传递给函数,也可作为返回值被函数返回。Rust 中的闭包与其他编程语言中的闭包都有所不同。接下来,我们将跟着老师一起,慢慢解开闭包的神秘面纱。
01-Rust 中的闭包
在 Rust 的官方文档中对闭包的定义是:
A closure expression produces a closure value with a unique, anonymous type that cannot be written out. A closure type is approximately equivalent to a struct which contains the captured variables.译:闭包由闭包表达式产生,具有唯一、匿名的类型。闭包类型近似地等价于一个由它从上下文中捕获的变量组成结构体。
从上面的描述中,我们可以知道,Rust 中的闭包是一个类型(或者说结构体),且该类型无法在别的地方使用(匿名)。且闭包类型由所有从上下文(作用域)中捕获的变量组成。
Rust 中闭包表达式形如:|args| { codes },这种闭包以只读引用的形式捕获上下文中的变量;如果需要所有权转移到闭包中,可以使用 move |args| { codes }。
闭包类型这种特殊的结构体到底长什么样?考虑如下代码:
c 是一个闭包,它的类型结构体大概类似于:
闭包是存储在栈上的,并且除了捕获的数据外,闭包本身不包含任何额外函数指针指向闭包的代码。
02-Rust 的闭包类型
Rust 中,声明闭包时并不需要指定闭包要满足的约束,但当闭包作为参数传递给函数或作为一个结构体的域时,需要对闭包的类型进行约束。接下来我们一起学习下 Rust 中的闭包类型。
02.1-FnOnce
FnOnce 的定义如下:
02.2-FnMut
02.3-Fn
本节课程链接:《19|闭包:FnOnce、FnMut和Fn,为什么有这么多类型?》
版权声明: 本文为 InfoQ 作者【Samson】的原创文章。
原文链接:【http://xie.infoq.cn/article/c6e1384ca10d5439f057d096b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论