Rust 程序设计(第 2 版)
Jim Blandy, Jason Orendorff, Leonora F. S. Tindall
软件工程师
1469 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
课程目录
已完结/共 41 讲
时长 02:41
时长 06:30
时长 10:04
时长 01:05
时长 50:06
时长 31:35
时长 34:39
时长 29:11
时长 37:15
时长 23:44
时长 44:19
时长 29:54
时长 39:01
时长 01:38
时长 01:15
时长 00:37
Rust 程序设计(第 2 版)
15
15
1.0x
00:00/00:00
登录|注册

第 14 章 闭包

拯救环境!现在就创建闭包!
——Cormac Flanagan
对整型向量进行排序很容易:
integers.sort();
遗憾的是,当我们想对一些数据进行排序时,它们几乎从来都不是整型向量。例如,对某种记录型数据来说,内置的 sort 方法一般不适用:
struct City {
name: String,
population: i64,
country: String,
...
}
fn sort_cities(cities: &mut Vec<City>) {
cities.sort(); // 出错:你到底想怎么排序?
}
Rust 会报错说 City 没有实现 std::cmp::Ord。我们需要指定排序顺序,如下所示:
/// 按照人口数量对城市进行排序的辅助函数
fn city_population_descending(city: &City) -> i64 {
-city.population
}
fn sort_cities(cities: &mut Vec<City>) {
cities.sort_by_key(city_population_descending); // 正确
}
辅助函数 city_population_descending 会接受 City 型记录并提取其,该键是我们对数据进行排序时要依据的字段。(它会返回一个负数,因为 sort 会按升序排列数值,而我们想要按降序排列:让人口最多的城市在前。)sort_by_key 方法会将这个取键函数作为参数。
这固然可行,但如果将辅助函数写成闭包(匿名函数表达式)则会更简洁:
fn sort_cities(cities: &mut Vec<City>) {
cities.sort_by_key(|city| -city.population);
}
这里的 |city| -city.population 就是闭包。它会接受一个参数 city 并返回 -city.population。Rust 会从闭包的使用方式中推断出其参数类型和返回类型。下面是标准库中接受闭包的其他例子。
mapfilter 这样的 Iterator 方法,可用于处理序列数据。第 15 章会介绍这些方法。
thread::spawn 这样的线程 API,会启动一个新的系统线程。并发就是要将工作转移给其他线程,而闭包能方便地表示这些工作单元。第 19 章会介绍这些特性。
一些需要根据条件计算默认值的方法,比如 HashMap 条目的 or_insert_with 方法。此方法用于获取或创建 HashMap 中的条目,当默认值的计算成本很高时就要使用闭包。默认值会作为闭包传入,只有当不得不创建新条目时才会调用此闭包。
当然,如今匿名函数无处不在,甚至连 Java、C#、Python、C++ 等最初没有匿名函数的语言中也有了其“身影”。从现在开始,我们假定你之前已经了解匿名函数,只想知道 Rust 的闭包与匿名函数有何不同。本章将介绍 3 种类型的闭包,你将学习如何将闭包与标准库方法一起使用、闭包如何“捕获”其作用域内的变量、如何编写自己的以闭包作为参数的函数和方法,以及如何存储闭包供以后用作回调。我们还将解释 Rust 闭包是如何实现的,以及它们为什么比你预想的要快。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust 闭包在语言中扮演着重要角色,能够捕获其所在函数的数据,并在排序、迭代器方法、线程 API 等场景中发挥重要作用。本文全面介绍了 Rust 闭包的特点和使用方法,强调了 Rust 使用生命周期而非垃圾回收来确保闭包的安全性,从而提高了程序的执行效率。此外,文章还讨论了闭包的三种类别,即Fn、FnMut和FnOnce,以及闭包的Copy和Clone特性。通过清晰的语言和实例代码,读者可以快速了解闭包的特性和使用方法。文章还介绍了闭包在 Rust 中的安全性,包括闭包的“杀死”和“FnOnce”特性,以及可变闭包的使用。最后,文章提到了回调函数在 Rust 中的应用,以及如何在自己的程序中实现类似的功能。通过实例代码和解释,读者可以了解如何使用闭包来实现简易路由器,并理解闭包在实际编程中的应用场景。总之,本文全面介绍了 Rust 闭包的特性、使用方法以及在实际编程中的应用,适合想要深入了解 Rust 闭包的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部