Skip to content

Commit 3093e13

Browse files
F001Naupio Z.Y. Huang
authored andcommitted
修复闭包栈帧的说法 (#205)
1 parent da921ce commit 3093e13

1 file changed

Lines changed: 3 additions & 4 deletions

File tree

13-closure/13-01-syntax.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ assert_eq!(10, num);
141141

142142
那么在这个例子中,我们的闭包取得了一个`num`的可变引用,然后接着我们调用了`add_num`,它改变了其中的值,正如我们期望的。我们也需要将`add_num`声明为`mut`,因为我们会改变它的环境。
143143

144-
如果我们改为一个`move`闭包,这有些不同
144+
如果我们加上`move`修饰闭包,会发生些不同
145145

146146
```rust
147147
let mut num = 5;
@@ -155,9 +155,8 @@ let mut num = 5;
155155
assert_eq!(5, num);
156156
```
157157

158-
我们只会得到`5`。与其获取一个我们`num`的可变借用,我们取得了一个拷贝的所有权。
159-
160-
另一个理解`move`闭包的方法:它给出了一个拥有自己栈帧的闭包。没有`move`,一个闭包可能会绑定在创建它的栈帧上,而`move`闭包则是独立的。例如,这意味着大体上你不能从函数返回一个非`move`闭包。
158+
我们只会得到`5`。这次我们没有获取到外部的`num`的可变借用,我们实际上是把 `num` move 进了闭包。因为 `num` 具有 Copy 属性,因此发生 move 之后,以前的变量生命周期并未结束,还可以继续在 `assert_eq!` 中使用。我们打印的变量和闭包内的变量是独立的两个变量。如果我们捕获的环境变量不是 Copy 的,那么外部环境变量被 move 进闭包后,
159+
它就不能继续在原先的函数中使用了,只能在闭包内使用。
161160

162161
不过在我们讨论获取或返回闭包之前,我们应该更多的了解一下闭包实现的方法。作为一个系统语言,Rust给予你了大量的控制你代码的能力,而闭包也是一样。
163162
> ### 这部分引用自[The Rust Programming Language中文版](https://github.com/KaiserY/rust-book-chinese/blob/master/content/Closures%20%E9%97%AD%E5%8C%85.md)

0 commit comments

Comments
 (0)