mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-03-15 03:40:29 +08:00
Update Ch15
This commit is contained in:
parent
4dbffe7348
commit
46960dc9ee
@ -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:
|
||||
|
||||

|
||||
|
||||
*图 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
|
||||
|
Loading…
Reference in New Issue
Block a user