闭包closure
捕获变量
闭包捕获变量采用了非常灵活的推导,可以根据需要,捕获外部变量的三种形式&T(borrow default)/&mut T(mut borrow)/T(move)
1 | fn main() { |
- 闭包默认通过borrow的方式捕获外部变量;
- 如果代码中包含了修改,那么编译器会自动的改成&mut T的形式。
- take同理如上;在闭包声明时,加上move修饰符,可以强制闭包拿走外部变量的所有权(force closure to take owership of capture)
闭包作为输入参数 Fn/FnMut/FnOnce
当把闭包作为输入参数的时候,由于闭包有三种捕获变量的形式,所以,函数声明时,必须指定闭包捕获变量的类型。
- Fn: the closure captures by reference (&T)
- FnMut: the closure captures by mutable reference (&mut T)
- FnOnce: the closure captures by value (T)
- 注,rust编译器采用最少严格模式捕获变量
- 简单来说,如果FnOnce标识闭包,那么闭包具有三种捕获方式,具体闭包内是如何使用的,编译器并不约束。
闭包作为输出参数
1 | fn create_fn() -> impl Fn() { |
- impl Fn()当作出参;
- 必须要使用move标识闭包,因为捕获的变量,在函数结束时候就会失效,必须用move take its ownership.
高阶函数
高阶函数,值那些接收一个或多个函数当作参数,产生一个更有用的函数。
高阶函数和延迟迭代是rust的主要函数编程特性。
1 | // Functional approach |
- 集合中的高阶函数map/find/any/every/filter/fold/take_while等等