|
|
@ -4,7 +4,7 @@
|
|
|
|
> <br>
|
|
|
|
> <br>
|
|
|
|
> commit ecc3adfe0cfa0a4a15a178dc002702fd0ea74b3f
|
|
|
|
> commit ecc3adfe0cfa0a4a15a178dc002702fd0ea74b3f
|
|
|
|
|
|
|
|
|
|
|
|
第一个智能指针相关的重要 trait 是`Deref`,它允许我们重载`*`,解引用运算符(不同于乘法运算符和全局引用运算符)。重载智能指针的`*`能使访问其后的数据更为方便,在这个部分的稍后介绍解引用强制多态时我们会讨论方便的意义。
|
|
|
|
第一个智能指针相关的重要 trait 是`Deref`,它允许我们重载`*`,解引用运算符(不同于乘法运算符和全局引用运算符)。重载智能指针的`*`能使访问其持有的数据更为方便,在本章结束前谈到解引用强制多态时我们会说明方便的意义。
|
|
|
|
|
|
|
|
|
|
|
|
第八章的哈希 map 的“根据旧值更新一个值”部分简要的提到了解引用运算符。当时有一个可变引用,而我们希望改变这个引用所指向的值。为此,首先我们必须解引用。这是另一个使用`i32`值引用的例子:
|
|
|
|
第八章的哈希 map 的“根据旧值更新一个值”部分简要的提到了解引用运算符。当时有一个可变引用,而我们希望改变这个引用所指向的值。为此,首先我们必须解引用。这是另一个使用`i32`值引用的例子:
|
|
|
|
|
|
|
|
|
|
|
@ -19,7 +19,7 @@ let mut x = 5;
|
|
|
|
assert_eq!(6, x);
|
|
|
|
assert_eq!(6, x);
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
我们使用`*y`来访问可变引用`y`所指向的数据,而是可变引用本身。接着可以修改它的数据,在这里对其加一。
|
|
|
|
我们使用`*y`来访问可变引用`y`所指向的数据,而不是可变引用本身。接着可以修改它的数据,在这里对其加一。
|
|
|
|
|
|
|
|
|
|
|
|
引用并不是智能指针,他们只是引用指向的一个值,所以这个解引用操作是很直接的。智能指针还会储存指针或数据的元数据。当解引用一个智能指针时,我们只想要数据,而不需要元数据。我们希望能在使用常规引用的地方也能使用智能指针。为此,可以通过实现`Deref` trait 来重载`*`运算符的行为。
|
|
|
|
引用并不是智能指针,他们只是引用指向的一个值,所以这个解引用操作是很直接的。智能指针还会储存指针或数据的元数据。当解引用一个智能指针时,我们只想要数据,而不需要元数据。我们希望能在使用常规引用的地方也能使用智能指针。为此,可以通过实现`Deref` trait 来重载`*`运算符的行为。
|
|
|
|
|
|
|
|
|
|
|
@ -69,7 +69,7 @@ struct that holds mp3 file data and metadata</span>
|
|
|
|
*(my_favorite_song.deref())
|
|
|
|
*(my_favorite_song.deref())
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
这个就是`self.audio`中的结果值。`deref`返回一个引用并接下来必需解引用而不是直接返回值的原因是所有权:如果`deref`方法直接返回值而不是引用,其值将被移动出`self`。这里和大部分使用解引用运算符的地方并不想获取`my_favorite_song.audio`的所有权。
|
|
|
|
这个就是`self.audio`中的结果值。`deref`返回一个引用并接下来必需解引用而不是直接返回值的原因是所有权:如果`deref`方法直接返回值而不是引用,其值将被移动出`self`。和大部分使用解引用运算符的地方相同,这里并不想获取`my_favorite_song.audio`的所有权。
|
|
|
|
|
|
|
|
|
|
|
|
注意将`*`替换为`deref`调用和`*`调用的过程在每次使用`*`的时候都会发生一次。`*`的替换并不会无限递归进行。最终的数据类型是`Vec<u8>`,它与列表 15-7 中`assert_eq!`的`vec![1, 2, 3]`相匹配。
|
|
|
|
注意将`*`替换为`deref`调用和`*`调用的过程在每次使用`*`的时候都会发生一次。`*`的替换并不会无限递归进行。最终的数据类型是`Vec<u8>`,它与列表 15-7 中`assert_eq!`的`vec![1, 2, 3]`相匹配。
|
|
|
|
|
|
|
|
|
|
|
@ -111,4 +111,4 @@ Rust 在发现类型和 trait 实现满足三种情况时会进行解引用强
|
|
|
|
|
|
|
|
|
|
|
|
头两个情况除了可变性之外是相同的:如果有一个`&T`,而`T`实现了返回`U`类型的`Deref`,可以直接得到`&U`。对于可变引用也是一样。最后一个有些微妙:如果有一个可变引用,它也可以强转为一个不可变引用。反之则是_不可能_的:不可变引用永远也不能强转为可变引用。
|
|
|
|
头两个情况除了可变性之外是相同的:如果有一个`&T`,而`T`实现了返回`U`类型的`Deref`,可以直接得到`&U`。对于可变引用也是一样。最后一个有些微妙:如果有一个可变引用,它也可以强转为一个不可变引用。反之则是_不可能_的:不可变引用永远也不能强转为可变引用。
|
|
|
|
|
|
|
|
|
|
|
|
`Deref` trait 对于只能指针模式十分重要的原因在于智能指针可以被看作普通引用并用于期望使用引用的地方。例如,无需重新编写方法和函数来直接获取智能指针。
|
|
|
|
`Deref` trait 对于智能指针模式十分重要的原因在于智能指针可以被看作普通引用并被用于期望使用普通引用的地方。例如,无需重新编写方法和函数来直接获取智能指针。
|