Update Ch15

This commit is contained in:
Unisko PENG 2023-05-10 16:10:15 +08:00
parent 4dbffe7348
commit 46960dc9ee

View File

@ -629,23 +629,22 @@ $ cargo run
当我们想在内存堆上分配一些数据给程序的多个部分读取,且无法在编译时确定哪个部分会最后使用完这些数据时,我们就会使用 `Rc<T>` 类型。如果我们知道哪个部分会最后完成,我们就可以让那个部分成为数据的所有者,而在编译时执行的正常所有权规则就会生效。
请注意 `Rc<T>` 仅适用于单线程场景only for use in single-threaded scenarios。当咱们在第 16 章中讨论并发时,咱们将接收如何在多线程程序中进行引用计数。
请注意 `Rc<T>` 仅适用于单线程场景only for use in single-threaded scenarios。当咱们在第 16 章中讨论并发时,咱们将介绍如何在多线程程序中进行引用计数。
### 使用 `Rc<T>` 来共用数据
**Using `Rc<T>` to Share Data**
下面来回到清单 15-5 中那个构造列表的示例。回顾到咱们曾使用 `Box<T>` 定义出的那个构造列表。这次,咱们将创建出同时共用了第三个列表的两个列表。概念上讲,这看起来与下图 15-3 类似:
让我们回到清单 15-5 中咱们的构造列表示例。回想一下,我们用 `Box<T>` 定义了他。这一次,我们将创建两个列表,二者会公用第三个列表的所有权。从概念上看,这类似于下图 15-3
![`b` 与 `c` 两个列表,共用了第三列表 `a` 的所有权](images/15-03.svg)
*图 15-03`b` 与 `c` 两个列表,共用第三列表 `a` 的所有权*
*图 15-03两个列表`b` 与 `c`,共用第三列表 `a` 的所有权*
这里将构造出包含 `5` 与其后 `10` 的列表 `a`。随后这里将构造两个另外的列表:以 `3` 开始的 `b` 和以 `4` 开始的列表 `c`。列表 `b``c` 都将接着延续到头一个包含着 `5``10` 的列表 `a`。换句话说,这两个列表将共用那包含了 `5``10` 的头一个列表。
咱们将创建一个包含 `5``10` 的列表。然后我们再做两个列表:以 `3` 开头的 `b` 和以 `4` 开头的 `c`,然后 `b``c` 的列表都会延续到第一个包含 `5``10``a` 列表。换句话说,这两个列表将共用第一个包含 `5``10`列表。
使用之前有着 `Box<T>``List` 尝试实现这种场景,就不会工作,如下清单 15-17 中所示:
尝试使用带有 `Box<T>``List` 定义来实现这个场景是行不通的,如示例 15-17 所示:
文件名:`src/main.rs`
@ -664,12 +663,12 @@ fn main() {
}
```
*清单 15-17对不允许有着两个用到 `Box<T>` 的列表尝试共用第三列表进行演示*
*清单 15-17演示咱们不允许有两个使用 `Box<T>` 的列表,试图共用第三个列表的所有权*
在编译上面的代码时,就会得到下面的报错:
当我们编译这段代码时,我们得到了这样的报错:
```console
$ cargo run  ✔  
$ cargo run
Compiling sp_demos v0.1.0 (/home/peng/rust-lang/sp_demos)
error[E0382]: use of moved value: `a`
--> src/main.rs:11:30