第 14 章 闭包
吉姆•布兰迪
拯救环境!现在就创建闭包!
——Cormac Flanagan
对整型向量进行排序很容易:
遗憾的是,当我们想对一些数据进行排序时,它们几乎从来都不是整型向量。例如,对某种记录型数据来说,内置的 sort 方法一般不适用:
Rust 会报错说 City 没有实现 std::cmp::Ord。我们需要指定排序顺序,如下所示:
辅助函数 city_population_descending 会接受 City 型记录并提取其键,该键是我们对数据进行排序时要依据的字段。(它会返回一个负数,因为 sort 会按升序排列数值,而我们想要按降序排列:让人口最多的城市在前。)sort_by_key 方法会将这个取键函数作为参数。
这固然可行,但如果将辅助函数写成闭包(匿名函数表达式)则会更简洁:
这里的 |city| -city.population 就是闭包。它会接受一个参数 city 并返回 -city.population。Rust 会从闭包的使用方式中推断出其参数类型和返回类型。下面是标准库中接受闭包的其他例子。
像 map 和 filter 这样的 Iterator 方法,可用于处理序列数据。第 15 章会介绍这些方法。
像 thread::spawn 这样的线程 API,会启动一个新的系统线程。并发就是要将工作转移给其他线程,而闭包能方便地表示这些工作单元。第 19 章会介绍这些特性。
一些需要根据条件计算默认值的方法,比如 HashMap 条目的 or_insert_with 方法。此方法用于获取或创建 HashMap 中的条目,当默认值的计算成本很高时就要使用闭包。默认值会作为闭包传入,只有当不得不创建新条目时才会调用此闭包。
当然,如今匿名函数无处不在,甚至连 Java、C#、Python、C++ 等最初没有匿名函数的语言中也有了其“身影”。从现在开始,我们假定你之前已经了解匿名函数,只想知道 Rust 的闭包与匿名函数有何不同。本章将介绍 3 种类型的闭包,你将学习如何将闭包与标准库方法一起使用、闭包如何“捕获”其作用域内的变量、如何编写自己的以闭包作为参数的函数和方法,以及如何存储闭包供以后用作回调。我们还将解释 Rust 闭包是如何实现的,以及它们为什么比你预想的要快。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
Rust 闭包在语言中扮演着重要角色,能够捕获其所在函数的数据,并在排序、迭代器方法、线程 API 等场景中发挥重要作用。本文全面介绍了 Rust 闭包的特点和使用方法,强调了 Rust 使用生命周期而非垃圾回收来确保闭包的安全性,从而提高了程序的执行效率。此外,文章还讨论了闭包的三种类别,即Fn、FnMut和FnOnce,以及闭包的Copy和Clone特性。通过清晰的语言和实例代码,读者可以快速了解闭包的特性和使用方法。文章还介绍了闭包在 Rust 中的安全性,包括闭包的“杀死”和“FnOnce”特性,以及可变闭包的使用。最后,文章提到了回调函数在 Rust 中的应用,以及如何在自己的程序中实现类似的功能。通过实例代码和解释,读者可以了解如何使用闭包来实现简易路由器,并理解闭包在实际编程中的应用场景。总之,本文全面介绍了 Rust 闭包的特性、使用方法以及在实际编程中的应用,适合想要深入了解 Rust 闭包的读者阅读。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论