Update Ch15

This commit is contained in:
Unisko PENG 2023-05-10 16:29:34 +08:00
parent 46960dc9ee
commit f79efeab7b

View File

@ -684,9 +684,9 @@ For more information about this error, try `rustc --explain E0382`.
error: could not compile `sp_demos` due to previous error;
```
那些 `Cons` 变种,拥有他们所保存的数据,因此在创建出那个 `b` 列表时,`a` 就被迁移进了 `b`,进而 `b` 就拥有了 `a`。随后,在创建出 `c` 而尝试再次使用 `a` 时,因为 `a` 已被迁移,因此这里就不再被允许了。
`Cons` 变种拥有他们持有的数据,所以当我们创建 `b` 列表时,`a` 被迁移到 `b` 中,`b` 拥有了 `a`。然后,当我们在创建 `c` 时试图再次使用 `a`,我们不被允许,因为 `a` 已经被迁移了。
这里原本是可以将 `Cons` 的定义,修改为保存引用的,但随后就必须要指定生命周期参数。经由制定生命周期参数,这里就指出了列表中的每个元素,都将与整个列表有同样的存活时间。这正是清单 15-17 中元素与列表的情形,但并非是所有场景中的情形
咱们原本可以将 `Cons` 的定义修改为持有引用,但那样咱们就必须指定生命周期参数。通过指定生命周期参数,咱们将指定列表中的每个元素,都至少与整个列表的寿命一样长。清单 15-17 中的元素与列表就是这种情况,但并非在所有情况下都如此
相反,这里将把 `List` 的定义,修改为在 `Box<T>` 处运用 `Rc<T>`,如下清单 15-18 中所示。这样各个 `Cons` 变种,现在就将保存一个值与一个指向某个 `List``Rc<T>` 了。在创建出 `b` 时,就不再是取得 `a` 的所有权,而是将克隆出 `a` 正保存的那个 `Rc<List>`,因此将引用的数据,从一个增加到了两个,实现了 `a``b` 共用那个 `Rc<List>` 中的数据。在创建出 `c` 时,这里也将克隆 `a`,从而将引用的数据,从两个增加到三个。每次调用 `Rc::clone` 时,到那个 `Rc<List>` 里头数据的引用计数,都将增加,同时除非到其引用为零,该数据便不会被清理掉。