RUST 学习日记 第20课 ——闭包

RUST 学习日记 第20课 ——闭包


0x00 回顾与开篇

我们已经通过两节课介绍了Rust的函数使用方法,尤其是要学会使用Rust的高阶函数,它在后续的项目编写中会变得很常用。这节课学习函数的另一种表现形式——闭包(Closure),有些人也被称其为匿名函数,但不准确。

0x01 闭包的定义

闭包(Closure)通常是指词法闭包,是一个持有外部环境变量的函数。外部环境是指闭包定义时所在的词法作用域。外部环境变量,在函数式编程范式中也被称为自由变量,是指并不是在闭包内定义的变量。将自由变量和自身绑定的函数就是闭包。闭包通常有参数列表(由两条竖线包裹)和表达式组成,语法形式如下。

| parameters | expression

示例代码如下:

	let add = |a, b| a + b;
	// let add: fn(i32, i32) -> i32 = |a, b| a + b;
    let result = add(1, 2);
	// let result = add(1.2, 3.4);
    dbg!(result);

代码运行结果:

result = 3

解释下上面的代码,第一行代码声明了一个函数类型,其使用闭包语法创建的。我们没有为其指定类型,它会根据上下文推断为fn(i32, i32) -> i32类型,相当于第二行注释。再看第4行注释的代码,如果将它打开则会报错,因为前面已经将其推断为fn(i32, i32) -> i32类型,不再接收其它类型。从上面的代码来看,又感觉闭包是简化版的函数。

0x02 从函数到闭包

下面用一个例子来看下从函数到闭包经过了哪些变化。

首先我们先定义一个函数

fn add(a:i32, b:i32) -> i32 {a + b}

转成闭包,使用let关键字声明,括号变成管道符号。最后添加分号结束。

let add = |a:i32, b:i32|->i32 {a + b};

简化,去除参数类型的声明。闭包并不像函数那样严格要求注明函数类型和返回值类型,去除括号。

let add = |a, b| {a + b};

继续简化,

let add = |a, b| a + b;
0x03 捕获变量

在闭包中还存在一个特点,它可以捕获和使用其被定义时所在的作用域中的变量。

示例代码如下:

	let k = 8;
    let add_var = |a| a + k;

    let result = add_var(10);
    dbg!(result);

代码运行结果:

result = 18
0x04 小结

本节介绍了Rust的闭包。总结下闭包的特点吧。

  • 闭包不严格要求注明参数和返回值类型
  • 不注明类型的闭包,若多次调用但传递不同类型,则会发生错误
  • 闭包可以捕获和使用其所在作用域中的变量
  • 闭包通常适用于相对较小的场景上下文
  • 闭包性能要快于函数指针(后续章节会详细介绍)

本节课仅仅是简单介绍了闭包的使用,关于闭包其实还有更多的知识点。在后续的Rust进阶课程中我会再次讲解闭包。

0x04 本节源码

020 · StudyRust - 码云 - 开源中国 (gitee.com)

下节预告—— 迭代器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuuhhhyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值