|
|
@ -29,7 +29,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
这里的错误告诉我们并不能调用 `join`,因为我们只有每一个 `worker` 的可变借用,而 `join` 需要获取其参数的所有权。为了解决这个问题,需要一个方法将 `thread` 移动出拥有其所有权的 `Worker` 实例以便 `join` 可以消费这个线程。示例 18-15 中我们曾见过这么做的方法:如果 `Worker` 存放的是 `Option<thread::JoinHandle<()>`,就可以在 `Option` 上调用 `take` 方法将值从 `Some` 成员中移动出来而对 `None` 成员不做处理。换句话说,正在运行的 `Worker` 的 `thread` 将是 `Some` 成员值,而当需要清理 worker 时,将 `Some` 替换为 `None`,这样 worker 就没有可以运行的线程了。
|
|
|
|
这里的错误告诉我们并不能调用 `join`,因为我们只有每一个 `worker` 的可变借用,而 `join` 需要获取其参数的所有权。为了解决这个问题,需要一个方法将 `thread` 移动出拥有其所有权的 `Worker` 实例以便 `join` 可以消费这个线程。示例 18-15 中我们曾见过这么做的方法:如果 `Worker` 存放的是 `Option<thread::JoinHandle<()>`,就可以在 `Option` 上调用 `take` 方法将值从 `Some` 成员中移动出来而对 `None` 成员不做处理。换句话说,正在运行的 `Worker` 的 `thread` 将是 `Some` 成员值,而当需要清理 worker 时,将 `Some` 替换为 `None`,这样 worker 就没有可以运行的线程了。
|
|
|
|
|
|
|
|
|
|
|
|
然而,这种情况**只**会在丢弃 `Worker` 时出现。相应地,我们必须在任何访问 `worker.thread` 的处理 `Option<thread::JoinHandle<()>>`。在惯用的 Rust 代码中 `Option` 用的很多,但当你发现自己总是知道 `Option` 中一定会有值,却还要将其包装在 `Option` 中来应对这一场景时,就应该考虑其他更优雅的方法了。
|
|
|
|
然而,这种情况**只**会在丢弃 `Worker` 时出现。相应地,我们必须在任何访问 `worker.thread` 时处理 `Option<thread::JoinHandle<()>>`。在惯用的 Rust 代码中 `Option` 用的很多,但当你发现自己总是知道 `Option` 中一定会有值,却还要将其包装在 `Option` 中来应对这一场景时,就应该考虑其他更优雅的方法了。
|
|
|
|
|
|
|
|
|
|
|
|
在这个例子中,存在一个更好的替代方案:`Vec::drain` 方法。它接受一个 range 参数来指定哪些项要从 `Vec` 中移除,并返回一个这些项的迭代器。使用 `..` range 语法会从 `Vec` 中移除**所有**值。
|
|
|
|
在这个例子中,存在一个更好的替代方案:`Vec::drain` 方法。它接受一个 range 参数来指定哪些项要从 `Vec` 中移除,并返回一个这些项的迭代器。使用 `..` range 语法会从 `Vec` 中移除**所有**值。
|
|
|
|
|
|
|
|
|
|
|
|