|
|
|
@ -76,7 +76,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
|
|
#### 定义自己的智能指针
|
|
|
|
#### 定义自己的智能指针
|
|
|
|
|
|
|
|
|
|
|
|
现在,让我们一起来实现一个智能指针,功能上类似 `Box<T>`。由于 `Box<T>` 本身很简单,并没有包含类如长度、最大长度等信息,因此用一个元组结构体即可。
|
|
|
|
现在,让我们一起来实现一个智能指针,功能上类似 `Box<T>`。由于 `Box<T>` 本身很简单,并没有包含例如长度、最大长度等信息,因此用一个元组结构体即可。
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
struct MyBox<T>(T);
|
|
|
|
struct MyBox<T>(T);
|
|
|
|
@ -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 规则总结
|
|
|
|
## Deref 规则总结
|
|
|
|
|
|
|
|
|
|
|
|
|