mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-01-13 22:00:50 +08:00
Update Ch14
This commit is contained in:
parent
d2153d1281
commit
942075cf07
8
projects/closure_move_demo/Cargo.toml
Normal file
8
projects/closure_move_demo/Cargo.toml
Normal 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]
|
10
projects/closure_move_demo/src/main.rs
Normal file
10
projects/closure_move_demo/src/main.rs
Normal 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();
|
||||
}
|
@ -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))
|
||||
|
@ -786,6 +786,11 @@ $ rustup component add llvm-tools-preview
|
||||
|
||||
## 附录 I - 术语清单
|
||||
|
||||
|
||||
- 迁移所有权
|
||||
|
||||
在闭包参数清单前,使用 `move` 关键字,让闭包取得其用到的所在环境中的值所有权。
|
||||
|
||||
- 文档注释
|
||||
|
||||
Documentation comment, 将产生出 HTML 的注释。
|
||||
|
Loading…
Reference in New Issue
Block a user