diff --git a/src/advance/concurrency-with-threads/sync1.md b/src/advance/concurrency-with-threads/sync1.md index bd028963..6ef2477b 100644 --- a/src/advance/concurrency-with-threads/sync1.md +++ b/src/advance/concurrency-with-threads/sync1.md @@ -149,7 +149,7 @@ error[E0277]: `Rc>` cannot be sent between threads safely 错误中提到了一个关键点:`Rc`无法在线程中传输,因为它没有实现`Send`特征(在下一节将详细介绍),而该特征可以确保数据在线程中安全的传输。 -##### 多线程安全的 Arc +##### 多线程安全的 `Arc` 好在,我们有`Arc`,得益于它的[内部计数器](https://course.rs/advance/smart-pointer/rc-arc.html#多线程无力的rc)是多线程安全的,因此可以在多线程环境中使用: diff --git a/src/advance/errors.md b/src/advance/errors.md index 58233145..e94b1221 100644 --- a/src/advance/errors.md +++ b/src/advance/errors.md @@ -521,7 +521,7 @@ fn render() -> Result { 下面依次来看看相关的解决方式。 -#### Box +#### `Box` 大家还记得我们之前提到的 `std::error::Error` 特征吧,当时有说:自定义类型实现 `Debug + Display` 特征的主要原因就是为了能转换成 `Error` 的特征对象,而特征对象恰恰是在同一个地方使用不同类型的关键: diff --git a/src/advance/into-types/sized.md b/src/advance/into-types/sized.md index 2d993d1c..d0a1195c 100644 --- a/src/advance/into-types/sized.md +++ b/src/advance/into-types/sized.md @@ -102,7 +102,7 @@ fn generic(t: &T) { `?Sized` 特征用于表明类型 `T` 既有可能是固定大小的类型,也可能是动态大小的类型。还有一点要注意的是,函数参数类型从 `T` 变成了 `&T`,因为 `T` 可能是动态大小的,因此需要用一个固定大小的指针(引用)来包裹它。 -## Box +## `Box` 在结束前,再来看看之前遗留的问题:使用 `Box` 可以将一个动态大小的特征变成一个具有固定大小的特征对象,能否故技重施,将 `str` 封装成一个固定大小类型? diff --git a/src/advance/smart-pointer/rc-arc.md b/src/advance/smart-pointer/rc-arc.md index 4e414349..dd2e7657 100644 --- a/src/advance/smart-pointer/rc-arc.md +++ b/src/advance/smart-pointer/rc-arc.md @@ -9,7 +9,7 @@ Rust 所有权机制要求一个值只能有一个所有者,在大多数情况 这种实现机制就是 `Rc` 和 `Arc`,前者适用于单线程,后者适用于多线程。由于二者大部分情况下都相同,因此本章将以 `Rc` 作为讲解主体,对于 `Arc` 的不同之处,另外进行单独讲解。 -## Rc +## `Rc` 引用计数(reference counting),顾名思义,通过记录一个数据被引用的次数来确定该数据是否正在被使用。当引用次数归零时,就代表该数据不再被使用,因此可以被清理释放。 @@ -144,7 +144,7 @@ fn main() { - `Rc` 只能用于同一线程内部,想要用于线程之间的对象共享,你需要使用 `Arc` - `Rc` 是一个智能指针,实现了 `Deref` 特征,因此你无需先解开 `Rc` 指针,再使用里面的 `T`,而是可以直接使用 `T`,例如上例中的 `gadget1.owner.name` -## 多线程无力的 Rc +## 多线程无力的 `Rc` 来看看在多线程场景使用 `Rc` 会如何: