写点什么

每日一 R「13」数据结构(四)闭包

作者:Samson
  • 2022 年 8 月 23 日
    上海
  • 本文字数:985 字

    阅读完需:约 3 分钟

每日一R「13」数据结构(四)闭包

今天我们来学习数据结构系列中的最后一讲内容,闭包。闭包是函数编程语言中非常重要的一个工具,它可以作为参数传递给函数,也可作为返回值被函数返回。Rust 中的闭包与其他编程语言中的闭包都有所不同。接下来,我们将跟着老师一起,慢慢解开闭包的神秘面纱。

01-Rust 中的闭包

在 Rust 的官方文档中对闭包的定义是:


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 }。


闭包类型这种特殊的结构体到底长什么样?考虑如下代码:


let name:String = String::from("rust");let mut table = HashMap::new();table.insert("hello", "world");let c = move || println!("hello: {}, {:?}", name, table);
复制代码


c 是一个闭包,它的类型结构体大概类似于:


struct anonymousC {    name: String,    table: HashMap<&str, &str>,}
复制代码


闭包是存储在栈上的,并且除了捕获的数据外,闭包本身不包含任何额外函数指针指向闭包的代码。

02-Rust 的闭包类型

Rust 中,声明闭包时并不需要指定闭包要满足的约束,但当闭包作为参数传递给函数或作为一个结构体的域时,需要对闭包的类型进行约束。接下来我们一起学习下 Rust 中的闭包类型。

02.1-FnOnce

FnOnce 的定义如下:


pub trait FnOnce<Args> {    type Output;    extern "rust-call" fn call_once(self, args: Args) -> Self::Output;}
复制代码

02.2-FnMut

pub trait FnMut<Args>: FnOnce<Args> {    extern "rust-call" fn call_mut(        &mut self,         args: Args    ) -> Self::Output;}
复制代码

02.3-Fn

pub trait Fn<Args>: FnMut<Args> {    extern "rust-call" fn call(&self, args: Args) -> Self::Output;}
复制代码


本节课程链接:《19|闭包:FnOnce、FnMut和Fn,为什么有这么多类型?

发布于: 刚刚阅读数: 3
用户头像

Samson

关注

还未添加个人签名 2019.07.22 加入

还未添加个人简介

评论

发布
暂无评论
每日一R「13」数据结构(四)闭包_学习笔记_Samson_InfoQ写作社区