为了体会默认情况下智能指针与引用的不同,让我们创建一个类似于标准库提供的 Box 类型的智能
指针。接着学习如何增加使用解引用运算符的功能。
从根本上说,Box 被定义为包含一个元素的元组结构体,所以示例 15-8 以相同的方式定义了
MyBox 类型。我们还定义了 new 函数来对应定义于 Box 的 new 函数:
文件名: src∕main.rs
struct MyBox(T);
impl MyBox {
fn new(x: T) -> MyBox {
MyBox(x)
}
}
fn main() {}
示例 15-8:定义 MyBox 类型
这里定义了一个结构体 MyBox 并声明了一个泛型参数 T,因为我们希望其可以存放任何类型的值。
MyBox 是一个包含 T 类型元素的元组结构体。MyBox::new 函数获取一个 T 类型的参数并返回一个存放
传入值的 MyBox 实例。
尝试将示例 15-7 中的代码加入示例 15-8 中并修改 main 使用我们定义的 MyBox 类型代替 Box。
示例 15-9 中的代码不能编译,因为 Rust 不知道如何解引用 MyBox:
文件名: src∕main.rs
struct MyBox(T);
impl MyBox {
fn new(x: T) -> MyBox {
MyBox(x)
}
}
fn main() {
let x = 5;
let y = MyBox::new(x);
assert_eq!(5, x);
assert_eq!(5, *y);
}
示例 15-9:尝试以使用引用和 Box 相同的方式使用 MyBox
得到的编译错误是:
$ cargo run
Compiling deref-example v0.1.0 (file:///projects/deref-example)
error[E0614]: type MyBox<{integer}>
cannot be dereferenced
–> src/main.rs:14:19
|
14 | assert_eq!(5, *y);
| ^^
For more information about this error, try rustc --explain E0614
.
error: could not compile deref-example
due to previous error
MyBox 类型不能解引用,因为我们尚未在该类型实现这个功能。为了启用 * 运算符的解引用功能,
需要实现 Deref trait。