Functional Language Features Iterators and Closures
Functional Language Features Iterators and Closures
Closures: Anonymous Functions that Capture Their Environment
闭包:可以捕获其所在环境的匿名函数
闭包的定义
1 | |parameters: type, ...| -> type { |
参数和返回值的类型可以不用显示标注,编译器会自动推断
可以将闭包赋值给变量调用
1 | let f = |num: i32| { |
如何让 struct 持有闭包
需要泛型和 Fn Trait
1 | struct Cacher<T> |
使用闭包捕获环境
直接使用函数不能捕获外界的变量
1 | // can't capture dynamic environment in a fn item |
使用闭包捕获外界的值
1 | let x = 5; |
闭包从所在环境捕获值的方式
- FnOnce 取得所有权
- FnMut 可变借用
- Fn 不可变借用
move
关键字,强制闭包获得它使用环境值的所有权
1 | let x = String::from("2024"); |
Processing a Series of Items with Iterators
迭代器模式:对一系列项执行某些任务
迭代器负责:遍历每个项,确定序列(遍历)何时完成
rust 的迭代器
懒惰的: 除非调用消费迭代器的方法,否则迭代器本身没有任何效果
1 | let v = vec![1, 2, 3]; |
iterator trait
所有 迭代器都实现了 iterator trait
iterator trait 仅要求实现一个方法 next
next 每次返回迭代器中的一项,返回结果包裹在 Some, 结束返回 None
迭代器使用
- iter : 在不可变引用上创建迭代器
- into_iter : 创建的迭代器会获得所有权
- iter_mut : 迭代可变的引用
map
接受一个闭包,闭包作用于每个元素,产生一个新的迭代器
collect
消耗型适配器,把结果收集到一个集合类型中
1 | let v = vec![1, 2, 3]; |
filter
接受闭包,闭包返回 bool 类型,当返回 true 时,产生的迭代器就会包含该元素
1 | let v = vec![1, 2, 3, 5, 6]; |
自定义迭代器,实现 next
1 | struct Counter { |
Comparing Performance: Loops vs. Iterators
迭代器与循环效率比较
迭代器效率更高
迭代器是 Rust 的 零成本抽象(zero-cost abstractions)之一,它意味着抽象并不会引入运行时开销
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GitSteve1025!