Update Ch14

This commit is contained in:
Peng Hailin, 2023-04-26 20:30:00 +08:00
parent d2153d1281
commit 942075cf07
4 changed files with 27 additions and 4 deletions

View File

@ -0,0 +1,8 @@
[package]
name = "closure_move_demo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

View File

@ -0,0 +1,10 @@
use std::thread;
fn main() {
let list = vec! [1, 2, 3];
println! ("在定义闭包之前的:{:?}", list);
thread::spawn(move || println! ("从线程打印出的:{:?}", list))
.join()
.unwrap();
}

View File

@ -255,11 +255,11 @@ $ cargo run le
在调用闭包之后:[1, 2, 3, 7]
```
请注意在 `borrows_mutably` 的定义与调用之间,不再有 `println!` `borrows_mutably` 被定义时,其就捕获了到 `list` 的可变引用。由于该闭包被调用后咱们没有再使用那个闭包因此这个可变借用就结束了。由于在有着可变借用a mutable borrow时不允许有其他的借用因此在该闭包的定义与调用期间打印那个 `list` 的不可变借用是不允许的。请尝试在里添加一个 `println!`,来看看咱们会得到什么报错!
请注意在 `borrows_mutably` 的定义与调用之间,不再有 `println!` `borrows_mutably` 被定义时,其就捕获了到 `list` 的可变引用。由于该闭包被调用后咱们没有再使用那个闭包因此这个可变借用就结束了。由于在有着可变借用a mutable borrow时不允许有其他的借用因此在该闭包的定义与调用期间打印那个 `list` 的不可变借用是不允许的。请尝试在里添加一个 `println!`,来看看咱们会得到什么报错!
在即使闭包的函数体并不严格需要所有权,而仍打算强制要求闭包取得他所使用的环境中一些值的所有权时,那么就可以在参数清单前,使用 `move` 关键字。
即使闭包主体不严格需要所有权,而咱们仍要强制闭包取得其用到的环境中值的所有权时,咱们可在参数清单前,使用 `move` 关键字。
在将闭包传递给某个新线程以迁移数据,从而令到数据为该新线程所掌握时,这种技巧最为有用。在第 16 章中,讲到并发的时候,就会详细讨论到线程及为何要使用线程,而现在,下面就来粗略地探讨一下,使用一个需要 `move` 关键字的闭包,生成一个新线程。下面清单 13-6 给出了修改后在一个新线程而非这个主线程中,打印出那个矢量值的修改后的清单 13-4
当将闭包传递给新线程以移动数据以使其由新线程拥有时,此技术最有用。当咱们在第 16 章中讲到并发时,将详细讨论线程与为何要使用线程,而现在,咱们来粗略地探讨一下,运用一个需要 `move` 关键字的闭包,生成新线程。下面清单 13-6 给出了修改后在新线程而非主线程中,打印出矢量值的清单 13-4
文件名:`src/main.rs`
@ -267,7 +267,7 @@ $ cargo run le
use std::thread;
fn main() {
let mut list = vec! [1, 2, 3];
let list = vec! [1, 2, 3];
println! ("在定义闭包之前的:{:?}", list);
thread::spawn(move || println! ("从线程打印出的:{:?}", list))

View File

@ -786,6 +786,11 @@ $ rustup component add llvm-tools-preview
## 附录 I - 术语清单
- 迁移所有权
在闭包参数清单前,使用 `move` 关键字,让闭包取得其用到的所在环境中的值所有权。
- 文档注释
Documentation comment, 将产生出 HTML 的注释。