diff --git a/projects/closure_move_demo/Cargo.toml b/projects/closure_move_demo/Cargo.toml new file mode 100644 index 0000000..76567a8 --- /dev/null +++ b/projects/closure_move_demo/Cargo.toml @@ -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] diff --git a/projects/closure_move_demo/src/main.rs b/projects/closure_move_demo/src/main.rs new file mode 100644 index 0000000..b874fd2 --- /dev/null +++ b/projects/closure_move_demo/src/main.rs @@ -0,0 +1,10 @@ +use std::thread; + +fn main() { + let list = vec! [1, 2, 3]; + println! ("在定义闭包之前的:{:?}", list); + + thread::spawn(move || println! ("从线程打印出的:{:?}", list)) + .join() + .unwrap(); +} diff --git a/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md b/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md index d19be74..fbbeb4e 100644 --- a/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md +++ b/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md @@ -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)) diff --git a/src/Ch21_Appendix.md b/src/Ch21_Appendix.md index 394a995..0cdcfa2 100644 --- a/src/Ch21_Appendix.md +++ b/src/Ch21_Appendix.md @@ -786,6 +786,11 @@ $ rustup component add llvm-tools-preview ## 附录 I - 术语清单 + +- 迁移所有权 + +在闭包参数清单前,使用 `move` 关键字,让闭包取得其用到的所在环境中的值所有权。 + - 文档注释 Documentation comment, 将产生出 HTML 的注释。