|
|
|
@ -318,7 +318,7 @@ error[E0434]: can't capture dynamic environment in a fn item // 在函数中无
|
|
|
|
|
#### 闭包对内存的影响
|
|
|
|
|
当闭包从环境中捕获一个值时,会分配内存去存储这些值。对于有些场景来说,这种额外的内存分配会成为一种负担。与之相比,函数就不会去捕获这些环境值,因此定义和使用函数不会拥有这种内存负担。
|
|
|
|
|
|
|
|
|
|
#### 三种Fn特征
|
|
|
|
|
#### 三种 Fn 特征
|
|
|
|
|
闭包捕获变量有三种途径,恰好对应函数参数的三种传入方式:转移所有权、可变借用、不可变借用,因此相应的 `Fn` 特征也有三种:
|
|
|
|
|
1. `FnOnce`,该类型的闭包会拿走被捕获变量的所有权。`Once` 顾名思义,说明该闭包只能运行一次:
|
|
|
|
|
|
|
|
|
@ -492,7 +492,7 @@ fn exec<'a, F: Fn(String) -> ()>(f: F) {
|
|
|
|
|
在这里,因为无需改变 `s`,因此闭包中只对 `s` 进行了不可变借用,那么在 `exec` 中,将其标记为 `Fn` 特征就完全正确。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##### move和Fn
|
|
|
|
|
##### move 和 Fn
|
|
|
|
|
在上面,我们讲到了 `move` 关键字对于 `FnOnce` 特征的重要性,但是实际上使用了 `move` 的闭包依然可能实现了 `Fn` 或 `FnMut` 特征。
|
|
|
|
|
|
|
|
|
|
因为,**一个闭包实现了哪种 Fn 特征取决于该闭包如何使用被捕获的变量,而不是取决于闭包如何捕获它们**。`move` 本身强调的就是后者,闭包如何捕获变量:
|
|
|
|
|