Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/advance/smart-pointer/deref.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ fn main() {

#### 定义自己的智能指针

现在,让我们一起来实现一个智能指针,功能上类似 `Box<T>`。由于 `Box<T>` 本身很简单,并没有包含类如长度、最大长度等信息,因此用一个元组结构体即可。
现在,让我们一起来实现一个智能指针,功能上类似 `Box<T>`。由于 `Box<T>` 本身很简单,并没有包含例如长度、最大长度等信息,因此用一个元组结构体即可。

```rust
struct MyBox<T>(T);
Expand Down Expand Up @@ -206,7 +206,7 @@ fn main() {
}
```

对于 `s1`,我们通过两次 `Deref` 将 `&str` 类型的值赋给了它(**赋值操作需要手动解引用**);而对于 `s2`,我们在其上直接调用方法 `to_string`,实际上 `MyBox` 根本没有没有实现该方法,能调用 `to_string`,完全是因为编译器对 `MyBox` 应用了 `Deref` 的结果(**方法调用会自动解引用**)。
对于 `s1`,我们通过两次 `Deref` 将 `&str` 类型的值赋给了它(**赋值操作需要手动解引用**);而对于 `s2`,我们在其上直接调用方法 `to_string`,实际上 `MyBox` 根本没有实现该方法,能调用 `to_string`,完全是因为编译器对 `MyBox` 应用了 `Deref` 的结果(**方法调用会自动解引用**)。

## Deref 规则总结

Expand Down
2 changes: 1 addition & 1 deletion src/advance/smart-pointer/rc-arc.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ fn main() {
error[E0277]: `Rc<String>` cannot be sent between threads safely
```

表面原因是 `Rc<T>` 不能在线程间安全的传递,实际上是因为它没有实现 `Send` 特征,而该特征是恰恰是多线程间传递数据的关键,我们会在多线程章节中进行讲解。
表面原因是 `Rc<T>` 不能在线程间安全的传递,实际上是因为它没有实现 `Send` 特征,而该特征恰恰是多线程间传递数据的关键,我们会在多线程章节中进行讲解。

当然,还有更深层的原因:由于 `Rc<T>` 需要管理引用计数,但是该计数器并没有使用任何并发原语,因此无法实现原子化的计数操作,最终会导致计数错误。

Expand Down