Update Ch15

This commit is contained in:
Unisko PENG 2023-05-09 11:26:09 +08:00
parent 4d2e5df777
commit db7765cab0
2 changed files with 29 additions and 4 deletions

View File

@ -1,3 +1,25 @@
fn main() {
println!("Hello, world!");
use std::ops::Deref;
struct MyBox<T>(T);
impl<T> MyBox<T> {
fn new(x: T) -> MyBox<T> {
MyBox(x)
}
}
impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
fn main() {
let boxed_string = MyBox::new(String::from("装箱的字符串"));
let x = 5;
let y = &x;
println! ("{}, {}", *boxed_string, *y);
}

View File

@ -451,13 +451,16 @@ fn main() {
*清单 15-13如果 Rust 没有解引用强制转换,我们将不得不编写的代码*
其中的 `(*m)` 将那个 `MyBox<String>` 解引用为了一个 `String`。随后的 `&``[..]`,则取了与 `hello` 函数签名相匹配,等于整个字符串的该 `String` 的字符串切片。这种不带有解引用强制转换的代码,因为涉及到全部的这些符号,而更难于阅读、编写与理解。正是解引用强制转换,实现了 Rust 为咱们自动处理这些转换。
`(*m)``MyBox<String>` 解引用为 `String`。然后 `&``[..]` 获取 `String` 等于整个字符串的一个字符串切片,以匹配 `hello` 的签名。由于涉及所有这些符号,这段没有解引用强制转换的代码更难阅读、编写和理解。 解引用强制转换允许 Rust 自动为我们处理这些转换。
为这些涉及到的类型定义了 `Deref` 特质时Rust 将分析这些类型,并运用必要次数的 `Deref::deref`,来获取到与函数或方法定义中参数类型相匹配的一个引用。所需插入的 `Deref::deref` 次数,是在编译时解算出来的,因此解引用强制转换优势的利用,并无运行时的代价。
所涉及的类型定义了 `Deref` 特质时Rust 将分析这些类型,并根据需要多次使用 `Deref::deref`,来获得与参数类型匹配的引用。所需插入 `Deref::deref` 次数,是在编译时就已确定,所以利用解引用强制转换的优势,没有运行时的代价!
### 解引用强制转换与可变性的互动方式
**How Deref Coercion Interacts with Mutability**
与使用 `Deref` 特质来覆写不可变引用上的 `*` 运算符的方式类似,咱们可以使用 `DerefMut` 特质,来覆写可变引用上的 `*` 运算符。
在以下三种情形下Rust 会在他发现类型与特质的实现时,执行强制引用转换: